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

  • 704. 二分查找 

  • 看到题目的第一想法:

  • 之前了解过二分法,只记得left,right左右指针了,完全忘记了还有middle指针,分区间和边界处理问题。二分法果然是:一看就会,一写就废,还是要把区间边界弄清楚,才能领会这道题的思想精髓。

  • 看完代码随想录之后的想法

  • 看了答案之后感觉这题很简单,so easy!

  • 如果是左闭右闭区间 [left,right],举个例子判断一下:[1,1]合理,那么left可以等于right。那么while(left <= right),在nums[middle] > target 时,right = middle - 1,在nums[middle] < target 时,left = middle + 1。

  • 如果是左闭右开区间 [left,right),举个例子判断一下:[1,1)不合理,那么left不可以等于right。那么while(left < right),在nums[middle] > target 时,right = middle ,在nums[middle] < target 时,left = middle + 1。

  • 实现过程中遇到哪些困难:

  • 主要就是区间边界问题容易乱。 

  • Python3代码如下:

  • (版本一)左闭右闭区间 [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) // 2
    
                if nums[middle] < target:
                    left = middle + 1
                elif nums[middle] > target:
                    right = middle - 1
                else:
                    return middle
            return -1

    (版本二)左闭右开区间 [left,right):

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

    27. 移除元素

  • 看到题目的第一想法:
  • 使用快慢指针,以前看见过,但却写不出来。。。
  • 看完代码随想录之后的想法:
  • 双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
  • 代码很简洁,思路也很清楚,fast快指针记录新数组中的元素,慢指针记录新数组中的位置,数组长度是返回慢指针
  • 但是暴力解法总是写不对!不知道错在哪?后来我发现是因为Python中的for循环的i是不能后退的,所以后来采用从后往前遍历,把这个问题解决了!
  • 暴力解法:空间复杂度O(n^2),时间复杂度O(1)
    class Solution:
        def removeElement(self, nums: List[int], val: int) -> int:
            size = len(nums)
            for i in range(size-1,-1,-1):
                if nums[i] == val:
                    for j in range(i+1, size):
                        nums[j-1] = nums[j]
                    size -=1
            return size
  • 双指针法:空间复杂度O(n),时间复杂度O(1)

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

  • 今日收获:双指针法yyds

  • 记录一下自己的学习时长:3小时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值