Day 1 | 704. 二分查找、27. 移除元素

704. 二分查找

题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。

先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。

题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.二分查找.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

思考

二分搜索一看就会,一写就废,while的判断条件和左边界、右边界怎么更新经常容易写错。
需要明确二分查找的区间定义,推荐左闭右闭的写法,即要查找的target在[left,right]区间内。
这样很容易明白跳出条件 while(left<=right) ,因为当left==right时,[left,right]还是有意义的区间。
mid不等于target时,left、right如何更新?
left 更新为 mid + 1
right 更新 mid - 1
因为,mid不等于target,区间定义又是左闭右闭的,边界需要跳过mid,到下一个。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        l = 0
        r = len(nums)-1
        while l <= r:
            mid = int((l+r)/2)
            if nums[mid] > target:
                r = mid - 1
            elif nums[mid] < target:
                l = mid + 1
            else:
                return mid
        return -1

27. 移除元素

题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。

题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.移除元素.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

思考

这道题目是经典的双指针题目,需要原地进行操作,节省空间。
在工作中也会经常遇到类似的场景,比如c语言需要提前申请空间,且大小不变,原地进行元素的移除。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        # 快指针i遍历原数组
        # 慢指针j原地更新 新数组
        j = 0
        for i in range(len(nums)):
            if nums[i]!=val:
                nums[j] = nums[i]
                j+=1
        return j
posted @ 2024-05-23 22:16  forrestr  阅读(25)  评论(0)    收藏  举报