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

二分查找

二分查找前提:1. 有序 2. 无重复

  • 时间复杂度:O(log n)
  • 空间复杂度:O(1)

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)

如何判断最好自己举个例子手推一下,也不麻烦,但是想一下或者背一下也行。

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

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

        while(left < right):
            middle = left + (right - left) // 2
            if nums[middle] > target:
                right = middle
            elif nums[middle] < target:
                left = middle + 1
            else:
                return middle
        
        return -1

移除元素

有两种方法:

暴力法

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
  • class Solution:
        def removeElement(self, nums: List[int], val: int) -> int:
            i, l = 0, len(nums)
            while i < l:
                if nums[i] == val: # 找到等于目标值的节点
                    for j in range(i+1, l): # 移除该元素,并将后面元素向前平移
                        nums[j - 1] = nums[j]
                    l -= 1
                    i -= 1
                i += 1
            return l
    

    快慢指针

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
    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
    

    全部评论

    相关推荐

    比亚迪深圳规划院 产品经理 0.9×1.36×12
    点赞 评论 收藏
    转发
    1 收藏 评论
    分享
    牛客网
    牛客企业服务