Day 1打卡

加入代码随想录的第一天,补day1的打卡 ~希望能坚持下来!

Day 1

LC 704 二分查找

大致思想:在一个区间中通过比较区间中点值和目标值,来更新区间的左右端点。区间初始化有左闭右开(left = 0 , right = len(nums))和左闭右闭(left = 0 , right = len(nums) -1 ) 两种。之前写过左闭右闭的写法,这次练一练左闭右开,这也更符合python的气质。若nums[mid] > target , 则更新right = mid ;若nums[mid] < target,则更新 left = mid + 1,此处究竟是mid还是mid+1取决于一开始对区间的定义。由于是左闭右开,是取不到右端点值的(因此初始化时right = len(nums)保证能搜索完整个数组),因此nums[mid] > target时,right更新为mid,将在left到mid-1的范围中搜索目标值;而nums[mid] < target时,左闭是取得到left索引对应的值,此时的mid已经确定是小于target了,因此将left更新为mid + 1,将在mid + 1到right的范围中搜索目标值。后略

LC 27 移除元素

首先用暴力法做了一遍。然后听卡哥介绍了双指针法,思路如下:快慢指针初始在0的位置,快指针用来读取新数组中需要的值(即不等于val的值),慢指针用来更新数组。当快指针读到不等于val的值,nums[write] = nums[read]更新数组;当快指针读到等于val时,直接continue,跳过这个值。实际上,我输出了一下nums本身,发现有些值等于val的地方并没被覆盖。比如这个例子,最终数组是[3, 1, 3, 1, 2, 1],2并没被完全覆盖。不过本题要求的是与nums 中与 val 不同的元素的数量,那就是write最后的大小(因为每当快指针遇到与 val 不同的元素时,慢指针+1),且这种更新方式能保证前k个元素包含不等于 val 的元素。

总而言之,快指针在前探路,慢指针更新数组。

nums = [2,3,1,3,2,1]
write = 0
for read in range(len(nums)):
    if nums[read] != 2:
        nums[write] = nums[read]
        print(nums)
        write += 1
    else:
        continue

LC 977.有序数组的平方

双指针,左,右指针初始化为数组的头尾,比较谁更大,放在结果数组的尾部即可。

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        i, j, r = 0, len(nums)-1, len(nums)-1
        res = [0] * len(nums) 
        while i <= j:
            if nums[i] ** 2 < nums[j] ** 2: 
                res[r] = nums[j] ** 2
                j -= 1 
            else:
                res[r] = nums[i] ** 2
                i += 1 
            r -= 1 
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值