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

86 阅读2分钟

背景:算法小白,不完整刷过一遍代码随想录,记录一下训练营二刷的心得(语言:python)

二分查找

题目链接:704. Binary Search

二分法是很基础的算法思想,难点主要在对于边界的控制,也就是卡哥讲的两种思路中[left,right]与[left,right)之间的区别。第一遍自己写的时候也是忽略的这个问题,让right= len(nums)-1, 导致提交过程中发现 nums长度为1时会直接跳过搜索条件而报错。 最终修改后:

开区间写法

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

闭区间写法

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

拓展题 34、35

题目链接:

34. Find First and Last Position of Element in Sorted Array

分别用二分法寻找左右边界

35. Search Insert Position

不同之处在于找不到目标值时返回的值

移除元素

题目链接:27. Remove Element

暴力解法

暴力解法两次遍历,一次找重复值一次删除值,需要注意的是删重复值时别忘记所有列表中的元素已经向前移一位,所以此时i的位置上是还没有查找过的数值,i -= 1来保证不会跳过该值。

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

双指针

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