补充知识:
利用二分思想先找其左边界,再找其右边界即可,注意找左边界的时候,由右侧逼近;找右边界的时候,由左侧逼近,即可。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2,-1);
if(nums.empty()) return res;
int n=nums.size(),l=0,r=n-1;
while(l<r){
int m=l+(r-l)/2;
if(nums[m]>=target) r=m;
else l=m+1;
}
if(nums[l]!=target) return res;
res[0]=l;
r=n;//边界条件
while(l<r){
int m=l+(r-l)/2;
if(nums[m]<=target) l=m+1;
else r=m;
}
res[1]=l-1;
return res;
}
};
`
由第一项进行二分突破。
class Solution {
public:
int search(vector<int>& nums, int target) {
if (target > nums[0]) {
for(int i = 0; i < nums.size(); i++) {
if (target == nums[i]) {
return i;
} else if (target < nums[i]) {
return -1;
}
}
} else if (target < nums[0]){
for(int i = nums.size()- 1; i >= 0; i--) {
if (target == nums[i]) {
return i;
} else if (target > nums[i]) {
return -1;
}
}
}else return 0;
return -1;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
//获取行列数据
int l = 0, r = m * n - 1, mid;
while(l <= r) {
mid = l + (r - l) / 2;
int x = matrix[mid / n][mid % n];
//mid/n得到行数,mid%n得到列数,这里可以不用单独用变量,可能会导致超时。
if(x < target) {
l = mid + 1;
} else if(x > target) {
r = mid - 1;
} else {
return true;
}
}
return false;
}
};