704. 二分查找

二分查找难点在于区间开闭,一般分为左闭右闭和左闭右开,区别在于while判断是否包含等于

左闭右闭:条件判断有等于,r=mid-1

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1;
        while(l <= r){
            int mid = l + (r-l)/2;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target) l = mid+1;
            else r = mid-1;
        }
        return -1;
    }
};

左闭右开:条件判断没有等于,r=mid

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size();
        while(l < r){
            int mid = l + (r-l)/2;
            if(nums[mid] == target) return mid;
            else if(nums[mid] < target) l = mid+1;
            else r = mid;
        }
        return -1;
    }
};

27. 移除元素

双指针:左指针指向的数字若等于val,则替换为右指针的数字,右指针左移;否则左指针右移,直到左指针索引大于右指针索引

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int l = 0,r = nums.size()-1;
        while(l <= r){
            if(nums[l] == val){
                nums[l] = nums[r--];
            }else{
                l++;
            }
        }
        return l;
    }
};