代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

704.二分查找

重点:1.查找前提是有序数组且无重复元素(否则返回数组下标会不唯一)

        2.主要有两种写法分别为:[left,right],[left,right),区间遵循不变量(每次搜索都必须满足区间定义)。

代码:

1.左闭右闭:[left,right]

int search(vector& nums, int target) {
        int left = 0;
        int right = nums.size()-1;//注:与左闭右开写法是不同的
        while(left <= right){//因为左右都为闭区间,所以左右可以相等
            int middle = (left + right)/2;
            if(target < nums[middle])
                right = middle - 1;//闭区间,middle当前值已经做过判断,则左区间不包含middle
            else if(target > nums[middle])
                left = middle + 1;//同理
            else   
                return middle;
        }
        return -1;
    }

2.左闭右开:[left,right)

int search(vector& nums, int target) {
        int left = 0;
        int right = nums.size();//由于右是开区间,初始时不包含数组的最后一个元素的,即//right指向数组最后一个元素的后一个
        while(left < right){//左右区间不可相等
            int middle = (left + right)/2;
            if(target < nums[middle])
                right = middle;//右区间为开区间,即当前middle值没判断,可将right指向middle
            else if(target > nums[middle])
                left = middle + 1;//左为闭区间
            else   
                return middle;
        }
        return -1;
}

注:两种写法在初始right值是不同的,具体情况具体分析

27.移除元素

法1:暴力解,两个for循环,外层找元素,内层移动元素,时间复杂度O(n^2)

法2:双指针法

思路:设置快慢指针,快指针的作用是寻找新元素,即指与删除元素不同的元素.慢指针的作用是记录新元素要存放的地址,可省去重复复制一个新数组的空间。每次快指针找到新元素就赋给慢指针,若快指针指向的元素与删除元素相同则跳过,继续遍历直到数组末尾.时间复杂度O(n)

int removeElement(vector& nums, int val) {
        int slowIndex = 0;
        for(int fastIndex = 0;fastIndex < nums.size();fastIndex++){
            if(val != nums[fastIndex]){
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
        return slowIndex;
    }

tip:快指针的作用同暴力解的外层for作用相同,即遍历数组,寻找除要删除元素外符合要求的新元素。慢指针的昨天同内层for,移动新元素到新数组相应的位置。

你可能感兴趣的:(算法)