目录
- 1.二分查找
- 2.在排序数组中查找元素的第一个和最后一个位置
- 3.x的平方根
- 4.搜索插入位置
- 5.山脉数组的峰顶索引
- 6. 寻找峰值
- 7.寻找旋转排序数组中的最小值
- 8.8.0~n-1中缺失的数字
1.二分查找
二分查找
class Solution {
public:int search(vector<int>& nums, int target) {int left=0,right=nums.size()-1;while(left<=right){int mid = left+(right-left)/2;if(nums[mid]<target) left = mid+1;else if(nums[mid]>target) right = mid-1;else return mid;}return -1;}
};
2.在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.size() == 0) return {-1,-1};int begin =-1;//查找区间的左端点int left = 0,right=nums.size()-1;while(left<right){int mid = left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right=mid;}if(nums[left]!=target) return {-1,-1};begin = left;//查找区间的右端点left = 0,right=nums.size()-1;while(left<right){int mid = left+(right-left+1)/2;if(nums[mid]<=target) left=mid;else right=mid-1;}return {begin,right};}
};
3.x的平方根
x的平方根
class Solution {
public:int mySqrt(int x) {if(x<1) return 0;int left =1,right=x;while(left<right){long long mid = left+(right-left+1)/2;if(mid*mid<=x) left=mid;else right=mid-1;}return left;}
};
4.搜索插入位置
搜索插入位置
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0,right =nums.size()-1;while(left<right){int mid = left+(right-left)/2;if(nums[mid]<target) left = mid+1;else right=mid;}if(nums[left]<target) return left+1;return left;}
};
5.山脉数组的峰顶索引
山脉数组的峰顶索引
class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 1,right = arr.size()-2;while(left<right){int mid = left+(right-left+1)/2;if(arr[mid]>arr[mid-1]) left = mid;else right = mid-1;}return left;}
};
6. 寻找峰值
寻找峰值
class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0,right = nums.size()-1;while(left<right){int mid = left+(right-left)/2;if(nums[mid]>nums[mid+1]) right=mid;else left = mid+1;}return left;}
};
7.寻找旋转排序数组中的最小值
寻找旋转排序数组中的最小值
class Solution {
public:int findMin(vector<int>& nums) {int left =0,right =nums.size()-1;int x = nums[right];while(left<right){int mid = left+(right-left)/2;if(nums[mid]>x) left = mid+1;else right=mid;}return nums[left];}
};
8.8.0~n-1中缺失的数字
0~n-1中缺失的数字
class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0,right=records.size()-1;while(left<right){int mid = left+(right-left)/2;if(records[mid]==mid) left = mid+1;else right = mid;}return records[left]==left?left+1:records[left]-1;}
};