class Solution {
public:
int searchInsert(vector& nums, int target) {
int left = 0, right = nums.size();
while(left < right){
int mid = left + (right-left)/2;
if(nums[mid] == target) return mid;
else if(nums[mid] > target) right = mid;
else left = mid+1;
}
return right;
}
};
最重要的还是如何取区间
当right = nums.size(), 表示为左闭右开,此时终止循环时,left = right
class Solution {
private:
int get(vector> matrix, int index){
int m = matrix.size(), n = matrix[0].size();
//纵坐标
int i = index/n;
//横坐标
int j = index%n;
return matrix[i][j];
}
public:
bool searchMatrix(vector>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();//m是竖列,n是横列
int left = 0, right = m*n-1;
while(left <= right){
int mid = left + (right-left)/2;
if(get(matrix, mid) > target) right = mid-1;
else if(get(matrix, mid) < target) left = mid+1;
else return true;
}
return false;
}
};
把二维的转换成一维的
class Solution {
public:
int findPeakElement(vector& 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 right;
}
};
class Solution {
public:
int search(vector& nums, int target) {
int left = 0, right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] == target) return mid;
else if(nums[mid] >= nums[left]){
//说明在断崖的左边,这里不要忘记等于
if(target >= nums[left] && target < nums[mid]){
right = mid-1;
}else{
left = mid+1;
}
}else{
if(target > nums[mid] && target <= nums[right]){
left = mid+1;
}else{
right = mid - 1;
}
}
}
return -1;
}
};
先确定断崖和mid的关系, 在找有序的部分
class Solution {
private:
int left_bound(vector& nums, int target){
int left = 0, right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] > target){
right = mid-1;
}else if(nums[mid] < target){
left = mid+1;
}else{
right = mid -1;
}
}
if(left >= nums.size()) return -1;
return nums[left] == target ? left: -1;
}
int right_bound(vector& nums, int target){
int left = 0, right = nums.size()-1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] > target){
right = mid-1;
}else if(nums[mid] < target){
left = mid+1;
}else{
left = mid +1;
}
}
if(right < 0) return -1;
return nums[right] == target ? right: -1;
}
public:
vector searchRange(vector& nums, int target) {
int lIndex = left_bound(nums, target);
int rIndex = right_bound(nums, target);
return {lIndex, rIndex};
}
};
class Solution {
public:
int findMin(vector& nums) {
if(nums.size() == 1) return nums[0];
int left = 0, right = nums.size()-1;
if(nums[left] < nums[right]) return nums[left];
while(left <= right){
int mid = left+(right-left)/2;
if(nums[mid+1] < nums[mid]) return nums[mid+1];
if(nums[mid-1] > nums[mid]) return nums[mid];
if(nums[mid] > nums[0]){
left = mid+1;
}else{
right = mid-1;
}
}
return -1;
}
};
lass Solution {
public:
vector twoSum(vector& numbers, int target) {
int left = 0, right = numbers.size()-1;
while(left < right){
int sum = numbers[left] + numbers[right];
if(sum > target) right--;
else if(sum < target) left++;
else return {left+1, right+1};
}
return {-1, -1};
}
};
class Solution {
public:
int maxArea(vector& height) {
int res = 0;
int left = 0, right = height.size()-1;
while(left < right){
int cur_area = min(height[left], height[right]) * (right-left);
res = max(res, cur_area);
if(height[left] < height[right]) left++;
else right--;
}
return res;
}
};