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

LeetCode 704二分查找

题目链接:704 二分查找

coding tips:middle = left + ((right - left) // 2)  这种写法可以防止整数溢出


初始思路:因为之前对这道题有所了解,所以看到题目并不陌生,知道要用 left, right, middle三个指针解决,但是具体是left < right 还是left <= right,以及left = middle是否加一,right = middle是否减一,都不确定....所以在做第一遍时总卡bug。

课程:B站 卡哥 二分查找讲解

思路更新:主要是明白区间的定义,也就是left right两个指针所指向的数字你是否包含。

  • [left, right]:两个指针指向的两个数字在本次计算的范围内。

在while条件中,left <= right。

当nums[middle] > target时:right = middle - 1,因为在上一轮已经对比过了,这一轮再等于middle的话就会重复计算,因此赋值时减一;

同理,nums[middle] < target时:left = middle + 1。

另外right在最初定义时,right = len(nums) - 1

  • [left, right):两个指针指向的两个数字,左边在范围内,右边不在。

在while条件中,left < right。

基于上述的理解,此时,仅需要对右侧改变,即当nums[middle] > target时:right = middle ,因为区间不包含右侧所指向的元素,这一轮等于middle时,middle不在区间内,符合规则。

另外right在最初定义时,right = len(nums)

代码示例:

[left, right)

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

        while left < right:
            middle = left + ((right - left) // 2)  # 防止整数溢出
            
            if nums[middle] < target:
                 left = middle + 1
            elif nums[middle] > target:
                right = middle
            else:
                return middle
        
        return -1

[left, right] 

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

        while left <= right:
            middle = left + ((right - left) // 2)  # 防止整数溢出
            
            if nums[middle] < target:
                 left = middle + 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                return middle
        
        return -1

LeetCode 27 移除元素

题目链接:移除元素

coding tips:所有可以定义在外面的计算都放在循环外面,可以节省计算时间(貌似)


初始思路:因为在题目中已经描写的非常清楚了,与数组的定义非常相关,即数组的元素是不能被删除的,只能被覆盖。(地址空间无法删除,申请多少就是多少)覆盖的意思不就基本可以理解为nums[j] = nums[i]。第一遍就过了,但是网站测得的时间复杂度较高。

课程:B站 卡哥 移除元素讲解

思路更新:思路没有什么变化,尝试了while,以及把len(nums)放到循环外面以后,好像速度变快了。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        j, i = 0, 0
        n = len(nums)
        while i < n:
            if nums[i] != val:
                nums[j] = nums[i]
                j += 1
            i += 1
        
        return j
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        j = 0
        n = len(nums)  # 在外面计算
        for i in range(n):
            if nums[i] != val:
                nums[j] = nums[i]
                j += 1
        
        return j

第一天总结:第一次探索跟着卡哥上课,今天花费了不少时间,希望明天把时间规划好,毕竟还得忙着毕业555。加油!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值