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

56 阅读1分钟

LeetCode 704 二分查找

题目链接:704 二分查找

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums)

        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

文章讲解:704 二分查找

视频讲解:二分查找

想法:之前用左闭右闭的写法写过这道题,于是这次想用左闭右开的写法。因为right是不被考虑的,因此在更新mid时直接mid = right就行,不同于左闭右闭的right是被查找过的,所以mid = right + 1

困难:TestcaseAC,提交时报错。在看了卡哥视频后发现是right边界定义的问题。由于是左闭右开的写法,right是没有被考虑进查找序列的,如果按照right = len(nums) -1,那么这个nums的最后一位将不会被查找到,因此需要改为right = len(nums)

总结:边界定义很重要


LeetCode 27 移除元素

题目链接:27 移除元素

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

        return slowIndex

文章讲解:27 移除元素

视频讲解:移除元素

想法:使用快慢指针。slowIndex作为更新后数组的下标,fastIndex作为更新数组的指针,如果nums[fastIndex] != val,那么更新数组nums[slowIndex] = nums[fastIndex]

困难:反向的逻辑思考,刚开始写的时候考虑的是if nums[fastIndex] == val,虽然能写但是写得很别扭,按照卡哥视频中所讲的思路「如果不相等,更新覆盖数组」比较好。

总结:需要了解双指针解法,以及如何更新数组的逻辑