water
704. 二分查找
扩展:34、35
27. 移除元素
704.二分查找
水
不管是开还是闭,都记住宗旨:不要重复,不要落下。就不会出错。
// 左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
int idx = -1;
int l = 0, r = nums.size() - 1;
while(l <= r)
{
int mid = (l + r) >> 1;
if(nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
l = mid + 1;
}
else if (nums[mid] > target)
{
r = mid - 1;
}
}
return -1;
}
};
// 左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int idx = -1;
int l = 0, r = nums.size();
while(l < r)
{
int mid = (l + r) >> 1;
if(nums[mid] == target)
{
return mid;
}
else if (nums[mid] < target)
{
l = mid + 1;
}
else if (nums[mid] > target)
{
r = mid;
}
}
return -1;
}
};
34. 在排序数组中查找元素的第一个和最后一个位置
二分的进阶应用,注意缩小范围就好
class Solution {
int findLower(vector<int>& nums, int target)
{
int lower = -1;
int l = 0, r = nums.size();
while(l < r)
{
int mid = (l + r) >> 1;
if(nums[mid] == target)
{
lower = mid;
r = mid;
}
else if(nums[mid] < target)
{
l = mid + 1;
}
else if(nums[mid] > target)
{
r = mid;
}
}
return lower;
}
int findUpper(vector<int>& nums, int target)
{
int upper = -1;
int l = 0, r = nums.size();
while (l < r)
{
int mid = (l + r) >> 1;
if (nums[mid] == target)
{
upper = mid;
l = mid + 1;
}
else if(nums[mid] < target)
{
l = mid + 1;
}
else if(nums[mid] > target)
{
r = mid;
}
}
return upper;
}
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
ans.push_back(findLower(nums, target));
ans.push_back(findUpper(nums, target));
return ans;
}
};
35. 搜索插入位置
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l = -1, r = nums.size();
while(r - l > 1)
{
int mid = (l + r) >> 1;
if(nums[mid] == target)
{
return mid;
}
else if (nums[mid] > target)
{
r = mid;
}
else if (nums[mid] < target)
{
l = mid;
}
}
return r;
}
};
27. 移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int l = 0, r = n - 1;
while(l <= r)
{
while(r >= 0 && nums[r] == val)
{
r--;
n--;
}
while(l < nums.size() && nums[l] != val)
l++;
if(l <= r)
swap(nums[l], nums[r]);
}
return n;
}
};