二分查找
区间的方式去看待,防止边界错误
左闭右闭的思想
[
x
,
y
]
→
[
left
,
right
]
[x,y] \to [\text{left}, \text{right}]
[x,y]→[left,right]
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;
}
};
双指针法
快慢双指针法解决
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int fast = 0; int slow = 0;
for(int fast = 0;fast< n;fast++){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
}
return slow;
}
};
首尾双指针解决
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> result(n, 0);
int left = 0; int right = nums.size() - 1;
int k = nums.size() - 1;
while(left <= right){
if(nums[left] * nums[left] >= nums[right] * nums[right]){
result[k--] = nums[left] * nums[left];
left ++;
}else{
result[k--] = nums[right] * nums[right];
right --;
}
}
return result;
}
};