33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)
方法一,遍历法
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 在不在这个部分。
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)
方法一,遍历法
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)
方法一,遍历法
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)
对于这道题,本质上是斐波那契数列。
对于第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)
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)
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)
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)
利用向下取整的性质进行计算