当题目中存在有序性或单调性 时,就应优先考虑二分查找:例如数组整体有序或局部有序(如旋转数组)、某个条件在区间内呈现"前真后假"或"前假后真"的分界特征、下标与数值存在固定关系(如缺失数字问题),或答案位于一个连续区间且可通过判断函数验证可行性;只要能够通过一次判断就排除一半区间,并且数据规模较大、要求 O ( l o g n ) O(logn) O(logn)复杂度,二分查找就是最合适的解法。
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0;
int 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];
}
};
1.6 示例测试(总代码)
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0;
int 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];
}
};
int main() {
Solution s;
vector<int> nums = {4,5,6,7,0,1,2};
cout << s.findMin(nums) << endl;
return 0;
}
class Solution {
public:
int takeAttendance(vector<int>& records) {
int left = 0;
int right = records.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (records[mid] == mid)
left = mid + 1;
else
right = mid;
}
return left == records[left] ? left + 1 : left;
}
};
2.6 示例测试(总代码)
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int takeAttendance(vector<int>& records) {
int left = 0;
int right = records.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (records[mid] == mid) left = mid + 1;
else right = mid;
}
return left == records[left] ? left + 1 : left;
}
};
int main() {
Solution s;
vector<int> records = {0,1,2,3,4,6,7};
cout << s.takeAttendance(records) << endl;
return 0;
}