33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)
方法一,遍历法
int search(int* nums, int numsSize, int target){ int i = 0; for(i = 0;i < numsSize;i++) { if(nums[i] == target) return i; } 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 在不在这个部分。
int search(int* nums, int numsSize, int target){ int low=0,high=numsSize-1;int output=-1; while(low<=high){ int mid=(low+high)/2; if(nums[mid]==target){ output=mid; return output; } if(nums[low]<=nums[mid]){ if(target>=nums[low]&&target<nums[mid]) high=mid-1; else low =mid+1; } else{ if(target>nums[mid]&&target<=nums[high]) low=mid+1; else high=mid-1; } } return -1; }
81. 搜索旋转排序数组 II - 力扣(LeetCode) (leetcode-cn.com)
方法一,遍历法
bool search(int* nums, int numsSize, int target){ int i = 0; for(i = 0;i < numsSize;i++) { if(nums[i] == target) return true; } return false; }
方法二,二分查找
bool search(int* nums, int numsSize, int target) { if (numsSize == 0) return false; if (numsSize == 1) return nums[0] == target; int l = 0, r = numsSize - 1; while (l <= r) { int mid = (l + r) / 2; if (nums[mid] == target) return true; if (nums[l] == nums[mid] && nums[mid] == nums[r]) { ++l; --r; } else if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[numsSize - 1]) l = mid + 1; else r = mid - 1; } } return false; }
33. 搜索旋转排序数组 - 力扣(LeetCode) (leetcode-cn.com)
方法一,遍历法
int findMin(int* nums, int numsSize){ int i = 0; int min = 5000; for(i = 0;i < numsSize;i++) { if(nums[i] < min) min = nums[i]; } return min; }
方法二,二分查找
int search(int* nums, int numsSize, int target){ int low=0,high=numsSize-1;int output=-1; while(low<=high){ int mid=(low+high)/2; if(nums[mid]==target){ output=mid; return output; } if(nums[low]<=nums[mid]){ if(target>=nums[low]&&target<nums[mid]) high=mid-1; else low =mid+1; } else{ if(target>nums[mid]&&target<=nums[high]) low=mid+1; else high=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)
int climbStairs(int n){ if(n == 1) return 1; else { int i = 0; int a = 1; int b = 1; for(i = 0;i < n - 1;i++) { b = a + b; a = b - a; } return b; } }
509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
int fib(int n) { if(n <= 1) return n; int first = 0; int second = 1; for(int i = 0;i < n-1;i++) { int sum = first + second; first = second; second = sum; } return second; }
\1137. 第 N 个泰波那契数 - 力扣(LeetCode) (leetcode-cn.com)
int tribonacci(int n){ if(n == 0) return 0; else if(n == 1 || n == 2) return 1; else { int a = 0; int b = 1; int c = 1; int i = 0; int sum = 0; for(i =0;i < n - 2;i++) { sum = a + b + c; a = b; b = c; c = sum; } return sum; } }
2006. 差的绝对值为 K 的数对数目 - 力扣(LeetCode) (leetcode-cn.com)
int countKDifference(int* nums, int numsSize, int k){ int i = 0; int j = 0; int count = 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++; } } return count; }
LCP 06. 拿硬币 - 力扣(LeetCode) (leetcode-cn.com)
利用向下取整的性质进行计算