之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131690654?spm=1001.2014.3001.5501
我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带模拟面试环境。
701. 二分查找
直接过,注意边界就好。
相关题目
35.搜索插入位置
leetcode链接:
- 35.搜索插入位置
这里除了需要二分查找,还需要如果target不在数组内,返回待插入的位置。
class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;int middle = (right - left) / 2 + left;int pos = 0;while(left <= right){middle = (right - left) / 2 + left;if(nums[middle] > target){right = middle - 1;}else if(nums[middle] < target){left = middle + 1;}else{return middle;}}return right + 1;}
};
367. 有效的完全平方数
- 367.有效的完全平方数(opens new window)
使用二分法,left为1,right为num,找平方根
class Solution {
public:bool isPerfectSquare(int num) {int left = 1, right = num;while(left <= right){int middle = (right - left) / 2 + left;if((long)middle * middle < num){left = middle + 1;}else if((long)middle * middle > num){right = middle - 1;}else{return true;}}return false;}
};
69. x的平方根
class Solution {
public:int mySqrt(int x) {long left = 1, right = x;while(left <= right){long middle = (right - left) /2 + left;if(middle * middle < x){left = middle + 1;}else if (middle * middle > x){right = middle - 1;}else{return middle;}}return right;}
};
跟上面那题差不多,注意返回。
74. 搜索二维矩阵
这题就相当于把一个有序数组存储为一个二维矩阵。可以用二维数组的映射在做。实际上在计算机存储中。二维数组的存储就是按照一维数组来存的。比如下标为(i,j)的元素的一维数组下标就是i * nums[0].size + j。
class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int sz = matrix.size() * matrix[0].size();int left = 0, right = sz - 1;while(left <= right){int middle = (right - left) / 2 + left;//将middle一维下标转化为二维下标int mx = middle / matrix[0].size(), my = middle % matrix[0].size();if(matrix[mx][my] < target){left = middle + 1;}else if(matrix[mx][my] > target){right = middle - 1;}else{return true;}}return false;}
};
再试试分别比较,做两次二分,想让target与每行最后一个比较, 再在每一行做一个二分:
class Solution {
public:bool searchMatrix(vector<vector<int>> matrix, int target) {auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {return b < a[0];});if (row == matrix.begin()) {return false;}--row;return binary_search(row->begin(), row->end(), target);}
};