加入代码随想录的第一天,补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