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

205 阅读1分钟

Leetcode 704 Binary Search

1. 第一想法

有以前做过的印象,所以就是有left和right,比较当中的数和target的大小。

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

我一开始是(l+r)/2它提示我是float所以改成//

2. 看完后想法

完全没考虑过边界的问题,能过感觉是运气。其实做出来是有种背题感...因为逻辑上我之前只+-lr挺不合理的。

左闭右闭

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

左闭右开

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

3. 总结

考虑 while l < r这里是<还是<=,需要考虑区间是否合法。后面的是mid + 1还是mid,需要考虑它是否已经在区间中被检查过了。

Leetcode 27 Remove Element

1. 第一想法

并想不出来什么二分。一开始我想的是把= val的都变成float('inf'),但是它总是会剩下一个不删,我不知道为什么。后来直接用了python的remove。一开始也会有问题...然后是循环的copy才过。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        for i in nums[:]:
            if i == val:
                nums.remove(i)
        return len(nums)

2. 看完后想法

原来说的尝试暴解是2个for。我一开始没想到再用一个for来向前覆盖。理解了数组是怎么删元素的。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        s = 0
        for f in range(len(nums)):
            if nums[f] != val:
                nums[s] = nums[f]
                s += 1
        return s

3.总结

删除数组并不是直接就删了,是往前覆盖。