代码随想录算法训练营第一天

704. 二分查找

题目链接:704. 二分查找 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

思路:这道题的核心思路就是利用二分查找求解,二分法前提需要将数组排序

左闭右闭:

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

左闭右开:

因为右边边界是开着的,所以在区间中并没有nums[r]元素。 ,当nums[mid]  > target时,范围区间变成了[l, mid),即[l, r)此时真实的取值范围是[l, r - 1],所以r的取值就会等于mid

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

27. 移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

思路:同向双指针,一个指针一直向前,另一个指针只有交换位置的时候向前 + 1,当右指针指向列表最右边时循环结束。因为每找到一个不等于val值的元素后 l 都会 +1,即找到一个l == 1,两个l == 2 ……,所以只需要返回l就可以。
    def removeElement(self, nums: List[int], val: int) -> int:
        l, r = 0, 0
        while r < len(nums):
            if nums[r] != val:
                nums[l] = nums[r]
                l += 1
            r += 1
        return l

977.有序数组的平方

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

文章讲解:代码随想录

视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

思路:数组本身是有序的,只不过含有负数,此时最大值就在数组的两边,考虑使用双指针。

可以定义一个数组来存储平方后的元素,存放元素的顺序可以比较两个元素平方后的大小,也可以比较两数想加之后的大小。

比较平方


    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)
        l, r, i = 0, n - 1, n - 1
        ans = [0] * n
        while l <= r:
            if nums[l] ** 2 < nums[r] ** 2:
                ans[i] = nums[r] ** 2
                r -= 1
            else:
                ans[i] = nums[l] ** 2
                l += 1
            i -= 1
        return ans

比较绝对值大小

    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)
        l, r, i = 0, n - 1, n - 1
        ans = [0] * n
        while l <= r:
            if nums[r] + nums[l] >= 0:
                ans[i] = nums[r] ** 2
                r -= 1
            else:
                ans[i] = nums[l] ** 2
                l += 1
            i -= 1
        return ans

总结:双指针的前提是需要数组是有序的,其次双指针的位置可以是多样的,例如同向双指针和对向双指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值