704. 二分查找easy
典型的二分查找,主要学习了更简洁高效的代码写法
class Solution {
public:
int search(vector<int>& nums, int target) {
int right=nums.size()-1;
int left=0;
while(left<=right){
int cur=left+(right-left)/2;
if(nums[cur]==target)
return cur;
else if(nums[cur]<target)
left=cur+1;
else
right=cur-1;
}
return -1;
}
};
278. 第一个错误的版本easy
35. 搜索插入位置easy
34. 在排序数组中查找元素的第一个和最后一个位置medium
33. 搜索旋转排序数组medium
思路:对于这样的一个数组,从中间分开要么是左边有序的,要么是右边有序的,所以说还是可以使用二分查找的,还有就是要注意条件判断了
class Solution {
public:
int search(vector<int>& nums, int target) {
int sz=nums.size();
int left=0;
int right=sz-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
if(nums[0]<=nums[mid]){//左边有序,注意这里有等号,对应于right=left+1的情况
if(nums[left]<=target&&target<nums[mid])//target在左面
right=mid-1;
else
left=mid+1;
}
else{
if(nums[mid]<target&&target<=nums[right])
left=mid+1;
else
right=mid-1;
}
}
return -1;
}
};
74. 搜索二维矩阵medium
这道题我感觉是做过,但是提交后显示是第一次提交,
这个思路是从右上角开始,当前位置的值与目标值比较,根据结果向下或向左移动。
而使用二分查找的思路:
可以先找到可能包含目标值的那一行(也就是根据第一列元素使用二分查找找到第一个比目标值小的),再在那一列利用二分查找寻找是否包含目标元素
153. 寻找旋转排序数组中的最小值medium
就是在33搜索旋转数组的基础上,过程中保存有序序列最小值中的最小值,每次都舍弃有序的那一半序列即可
162. 寻找峰值medium
思路:因为是随便返回一个峰值就可以,所以,这道题可以一共看成就三种情况
- 递增序列
- 递减序列
- 增到峰值再减
所以根据中间元素与后面紧跟的元素比较,判断nums[mid]处在增序列还是减序列上,来决定舍弃哪一半
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int l=0;
int r=nums.size()-1;
while(l<r){
int mid=l+(r-l)/2;
if(nums[mid]<nums[mid+1])
l=mid+1;
else
r=mid;
}
return l;//最后肯定是l==r才退出的循环,所以随便返回一个就可以
}
};