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

题目链接:704 二分查找

关键点思路:

1、是否要进入到 while 部分的代码是 left <= right 还是 left < right, 看 [left, right] 是否是合法区间. 例如 [1, 1] 是合法区间,取<=; [1, 1) 非合法区间,取 < 。

2、缩小区间时,考虑边界是否已经比较过。

左闭右闭区间 [left, right]
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        l = 0
        r = len(nums) - 1
        while l <= r:                # 左闭右闭区间
            mid = (l+r) // 2
            if target < nums[mid]:   # mid 已经比较过,所以缩小区间取 mid - 1
                r = mid - 1
            elif target > nums[mid]:  # mid 已经比较过,所以缩小区间取 mid + 1
                l = mid + 1
            else:
                return mid
        return -1
左闭右开区间 [left, right)
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        l = 0
        r = len(nums)  # 左闭右开,避免错过最右端的元素
        while l < r:   # 采用左闭右开原则 [l, r)
            mid = (l+r) // 2
            if target < nums[mid]:
                r = mid                 # 缩小区间,右边为开区间
            elif target > nums[mid]:
                l = mid + 1             # 缩小区间,左边为闭区间,去除已比较过的 mid
            else:
                return mid
        return -1

时间复杂度为o(logn)

题目链接:27 移动元素

暴力法
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        n = len(nums)
        i, l = 0, n
        while i < l:
            if nums[i] == val:
                for j in range(i+1, l):
                    nums[j-1] = nums[j]
                i -= 1
                l -= 1
            i += 1
        return l

时间复杂度为 o(n**2)

双指针
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        n = len(nums)
        slow, fast = 0, 0   # 定义 slow 慢指针指向不是 val 元素的位置, fast 指向不是 val 的元素
        for i in range(n):
            if nums[i] != val:    # 将 fast 指向不为 val 的元素赋值给 slow 指向的位置
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

时间复杂度为 o(n)

posted @   忆象峰飞  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示