704. 二分查找
如何考虑区间:left == right有无意义。
二分查找时间复杂度:logn
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid - 1;
}else if (nums[mid] < target) {
left = mid + 1;
}else return mid;
}
return -1;
}
};
35.搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target) right = mid - 1;
else if (nums[mid] < target) left = mid + 1;
else return mid;
}
return right + 1;
}
};
left和right的下标弄清楚。
34. 在排序数组中查找元素的第一个和最后一个位置
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int r = getR(nums, target);
int l = getL(nums, target);
if (l == -2 || r == -2) return {-1, -1};
if ((r - l) > 1) return {l + 1, r - 1};
return {-1, -1};
}
private:
int getR(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int r = -2;
while (left <= right) {
int middle = (left + right) / 2;
if (nums[middle] > target) {
right = middle - 1;
}else {
left = middle + 1;
r = left;
}
}
return r;
}
int getL(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int l = -2;
while (left <= right) {
int middle = (left + right) / 2;
if (nums[middle] < target) {
left = middle + 1;
}else {
right = middle - 1;
l = right;
}
}
return l;
}
};
69.x的平方根
class Solution {
public:
int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if ((long long)mid * mid <= x) {
ans = mid;
left = mid + 1;
}
else right = mid - 1;
}
return ans;
}
};
367.有效的完全平方数
class Solution {
public:
bool isPerfectSquare(int num) {
int l = 0;
int r = num;
while (l <= r) {
int m = l + (r - l) / 2;
if ((long long)m * m < num) l = m + 1;
else if ((long long)m * m > num) r = m - 1;
else return true;
}
return false;
}
};
27. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0;
for (int right = 0; right < nums.size(); ++right) {
if (nums[right] != val) nums[left++] = nums[right];
}
return left;
}
};