代码随想录Day1 | LeetCode 704. 二分查找、LeetCode 27. 移除元素、LeetCode 977. 有序数组的平方

LeetCode 704. 二分查找

核心:明白[left, right] 和 [left, right)两种循环不变量

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

有关二分法其他经典题目:

LeetCode 35. 搜索插入位置

这道题实际上就是查找target的最左侧位置,如果没有就是第一个大于target的位置

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

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置

这一题就是“二分查找”集大成者

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def _left():
            left, right = 0, len(nums) - 1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] < target:
                    left = mid + 1
                else:
                    right = mid - 1
            if left == len(nums):
                return -1
            if nums[left] != target:
                return -1
            return left
        
        def _right():
            left, right = 0, len(nums) - 1
            while left <= right:
                mid = left + (right - left) // 2
                if nums[mid] > target:
                    right = mid - 1
                else:
                    left = mid + 1
            if right == -1:
                return -1
            if nums[right] != target:
                return -1
            return right
        return [_left(), _right()]

LeetCode 33. 搜索旋转排序数组

有关“二分查找”的主要变式
要注意if nums[mid] >= nums[left]中的“=”需要算在左崖上

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

LeetCode 74. 搜索二维矩阵

LeetCode 153. 寻找旋转排序数组中的最小值

LeetCode 4. 寻找两个正序数组的中位数

LeetCode 27. 移除元素

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        slow, fast = 0, 0
        while fast < len(nums):
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

977. 有序数组的平方

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left, right = 0, len(nums) - 1
        res = [None] * len(nums)
        p = len(nums) - 1
        while left <= right:
            if abs(nums[left]) < abs(nums[right]):
                res[p] = nums[right] ** 2
                right -= 1
            else:
                res[p] = nums[left] ** 2
                left += 1
            p -= 1
        return res
posted @   溺死在幸福里的猪  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示