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

1,170 阅读2分钟

今日感悟

今天题目是力扣中 704.二分查找以及27.移除元素,个人觉得算是一个比较入门的题目吧。

二分查找是我一直都会的算法,但是之前并不太了解开闭区间之间的区别,只是僵硬地背算法而已,今天看了Carl兄的视频没想到又让我有所收获,原来开闭区间以及后面的判断条件代表的是数组元素中包含的元素是否保留到下一个循环中作为参数使用。

// 二分查找
class Solution {
    public int search(int[] nums, int target) {
        int left=0;int right=nums.length-1;
        int middle = 0;
        while(left <= right){
            middle = left + (right - left)/2;
            if(nums[middle] > target){
                right = middle - 1;
            }else if (nums[middle] < target){
                left = middle + 1;
            }else{
                return middle;
            }
        }
        return -1;
    }
}

移除元素之前也只会暴力解法,今天初见这道题的时候我直呼简单,立刻手写了一个暴力解法出来,结果一看AC是AC了,但是这复杂度(O^2)爆炸了呀。思考片刻后无果,于是看了Carl兄的视频解法,他所使用的双指针虽说之前听过,但是自己还是悟不到怎么用的。听过之后好像有一点懂了的感觉,不知道所悟是否正确。

// 双指针妙解移除元素
class Solution {
    public int removeElement(int[] nums, int val) {
        int slow = 0; int fast = 0;
        while (fast < nums.length) {
            if (nums[fast] != val) {
                nums[slow++] = nums[fast];
            }
            fast++;
        }
        return slow;
    }
}

双指针在我看来,首先得明确两个指针各表示什么意思,只有明白不同的指针代表什么那代码才能让他们发挥各自的作用。在移除元素这道题里面,快指针代表了新数组中应该包含的元素(即不包含被移除元素),慢指针代表新数组当前位于最长长度的元素,而当快指针每扫到一个该放进新数组内的元素时可以让nums[slow] = nums[fast]。而每次循环结束后的fast++又让fast自动进一位,不得不说,这个双指针太妙了,一开始自己想的时候,想的是让慢指针去带着快指针移动,但是一直处理不了快指针的位置该放哪里,原来改变一下思路即可。

今日学习所用到的链接

704.二分查找

题目链接:leetcode.cn/problems/bi…

文章链接:programmercarl.com/0704.%E4%BA…

27.移除元素

题目链接:leetcode.cn/problems/re…

视频链接:www.bilibili.com/video/BV12A…