[小玄的刷题日记]《LeetCode零基础指南》(第4讲) 数组

简介: [小玄的刷题日记]《LeetCode零基础指南》(第4讲) 数组

33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)1.png

方法一,遍历法

intsearch(int* nums, intnumsSize, inttarget){
inti = 0;
for(i = 0;i < numsSize;i++)
    {
if(nums[i] == target)
returni;
    }
return-1;
}

方法二,二分查找

由题意可知,这道题在旋转后只能保证局部有序,因此,相较于有序的数组,我们需要进行进一步的思考。

可以发现,我们将数组分成两部分来看的时候,一定有一部分的数组是有序的

以   [4,5,6,7,0,1,2]  为例:,我们从 6 这个位置分开后数组变成了 [ 4 , 5 , 6 ] 和 [ 7 , 0 , 1 , 2]

其中左边的[ 4 , 5 , 6 ]是有序的,其他也是如此。

这启示我们在常规的二分查找时查看当前 mid 为分割出来的两个部分 [ l , mid ] 和 [ mid + 1 , r ]哪个部分是有序的,并根据有序的那个部分确定我们该如何改变二分查找的上下界,因为我们能根据有序的那部分判断出 target 在不在这个部分。

2.png

intsearch(int* nums, intnumsSize, inttarget){
intlow=0,high=numsSize-1;intoutput=-1;
while(low<=high){
intmid=(low+high)/2;
if(nums[mid]==target){
output=mid;
returnoutput;
        }
if(nums[low]<=nums[mid]){
if(target>=nums[low]&&target<nums[mid])
high=mid-1;
elselow =mid+1;
        }
else{
if(target>nums[mid]&&target<=nums[high])
low=mid+1;
elsehigh=mid-1;
        }
    }
return-1;
}

81. 搜索旋转排序数组 II - 力扣(LeetCode) (leetcode-cn.com)3.png

方法一,遍历法

boolsearch(int* nums, intnumsSize, inttarget){
inti = 0;
for(i = 0;i < numsSize;i++)
    {
if(nums[i] == target)
returntrue;
    }
returnfalse;
}

方法二,二分查找

boolsearch(int* nums, intnumsSize, inttarget) {
if (numsSize == 0)
returnfalse;
if (numsSize == 1)
returnnums[0] == target;
intl = 0, r = numsSize-1;
while (l <= r) {
intmid = (l + r) / 2;
if (nums[mid] == target)
returntrue;
if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
            ++l;
--r;
        } elseif (nums[l] <= nums[mid]) {
if (nums[l] <= target && target < nums[mid])
r = mid-1;
elsel = mid + 1;
        } else {
if (nums[mid] < target && target <= nums[numsSize-1])
l = mid + 1;
elser = mid-1;
        }
    }
returnfalse;
}

33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)5.png

方法一,遍历法

intfindMin(int* nums, intnumsSize){
inti = 0;
intmin = 5000;
for(i = 0;i < numsSize;i++)
    {
if(nums[i] < min)
min = nums[i];
    }
returnmin;
}

方法二,二分查找

intsearch(int* nums, intnumsSize, inttarget){
intlow=0,high=numsSize-1;intoutput=-1;
while(low<=high){
intmid=(low+high)/2;
if(nums[mid]==target){
output=mid;
returnoutput;
        }
if(nums[low]<=nums[mid]){
if(target>=nums[low]&&target<nums[mid])
high=mid-1;
elselow =mid+1;
        }
else{
if(target>nums[mid]&&target<=nums[high])
low=mid+1;
elsehigh=mid-1;
        }
    }
return-1;
}

70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)6.png

对于这道题,本质上是斐波那契数列。

对于第n阶台阶,由于我们一次可以走1阶或者是2阶,走到n阶的总方法等于走到(n-1)阶的总方法 + 走到(n-2)阶的总方法,所以可以得到如下的表达式

F(n) = F(n - 1) + F(n - 2)

intclimbStairs(intn){
if(n == 1)
return1;
else    {
inti = 0;
inta = 1;
intb = 1;
for(i = 0;i < n-1;i++)
        {
b = a + b;
a = b-a;
        }
returnb;
    }
}

509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)

18.png

intfib(intn)
{
if(n <= 1)
returnn;
intfirst = 0;
intsecond = 1;
for(inti = 0;i < n-1;i++)
    {
intsum = first + second;
first = second;
second = sum;
    }
returnsecond;
}

\1137. 第 N 个泰波那契数 - 力扣(LeetCode) (leetcode-cn.com)19.png

inttribonacci(intn){
if(n == 0)
return0;
elseif(n == 1 || n == 2)
return1;
else    {
inta = 0;
intb = 1;
intc = 1;
inti = 0;
intsum = 0;
for(i =0;i < n-2;i++)
        {
sum = a + b + c;
a = b;
b = c;
c = sum;
        }
returnsum;
    }
}

2006. 差的绝对值为 K 的数对数目 - 力扣(LeetCode) (leetcode-cn.com)20.png

intcountKDifference(int* nums, intnumsSize, intk){
inti = 0;
intj = 0;
intcount = 0;
for(i = 0;i <numsSize;i++)
    {
for(j = i + 1;j < numsSize;j++)
        {
if(nums[i] - nums[j] == k || nums[i] - nums[j] == -k)
count++;
        }
    }
returncount;
}

LCP 06. 拿硬币 - 力扣(LeetCode) (leetcode-cn.com)21.png22.png

利用向下取整的性质进行计算


目录
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
46 0
|
4月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
4月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
4月前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
46 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
24 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
25 0
Leetcode第三十三题(搜索旋转排序数组)