代码随想录 - Day2 - 双指针 / 快慢指针 + 滑动窗口
26. 删除有序数组中的重复项
快慢指针问题,和上一篇结尾的27. 移除元素属于同一类题。
自己写出来了代码且一次性通过,好耶!
slow = 1
t = nums[0]
for quick in range(len(nums)):
if nums[quick] != t:
t = nums[quick]
nums[slow] = t
slow += 1
return slow
283. 移动零
看到题就有思路了,依旧是快慢指针,结果写代码的时候因为一个小问题卡了半天,最后终于想到解决方法…
解决方法很简单,只是一开始钻牛角尖了,不然早该想到了
slow, cnt = 0, 0
for quick in range(len(nums)):
if nums[quick] != 0:
nums[slow] = nums[quick]
slow += 1
if nums[quick] == 0:
cnt += 1
for i in range(cnt):
nums[ - 1 - i] = 0
844. 比较含退格的字符串
用了双指针…某种程度上算是快慢指针吧。
def backSpace(string):
for quick in range(len(string)):
if string[quick] == "#":
slow = quick
while string[slow] == "#" and slow > 0:
slow -= 1
string[slow] = "#"
while "#" in string:
string.remove("#")
return string
s = list(s)
t = list(t)
if backSpace(s) == backSpace(t):
return True
return False
977. 有序数组的平方
这题好像和前面的题型都没啥联系(?)
for i in range(len(nums)):
nums[i] = nums[i] * nums[i]
nums.sort()
return nums
可能双指针法会快一点吧?
看leetcode执行用时也没上面的解法快啊,内存消耗还比上面的多。。。
res = [-1] * len(nums)
left, right, k = 0, len(nums) - 1, len(nums) - 1
while left <= right:
if nums[left] * nums[left] < nums[right] * nums[right]:
res[k] = nums[right] * nums[right]
right = right - 1
else:
res[k] = nums[left] * nums[left]
left = left + 1
k = k - 1
return res
暴力解法:O(n + nlog n)
双指针解法:O(n)
代码随想录说leetcode执行用时不准确,看着玩就行了…
还以为自己的暴力解法很快呢QAQ
滑动窗口
209. 长度最小的子数组
非常有思路,结果写的代码一直过不了。
看了讲解发现不该用if
,应该用while
,修改后终于对了。
最后return
的时候要判断一下,又稍微卡住了一会,看了题解明白了。
代码:
res = len(nums) + 1
sum = 0
left = 0
for right in range(len(nums)):
sum += nums[right]
while sum >= target:
res = min(res, right - left + 1)
sum -= nums[left]
left += 1
if res != len(nums) + 1:
return res
return 0
904. 水果成篮
思路和上一题差不多,不过while
的条件要变,里面还要加一重for
循环(这个for
循环的条件真是害惨了我QAQ)
不管怎样终究是做出来了,自己独立做出中等题,开心!
res = 0
left = 0
t1, t2 = fruits[0], 0
# 给 t1, t2 赋值
for i in fruits:
if t1 != i:
t2 = i
break
# 开始滑动窗口
for right in range(len(fruits)):
while fruits[right] != t1 and fruits[right] != t2:
# res = max(res, right - left + 1)
for i in range(right - 1, left - 1, -1):
if fruits[i] != fruits[right - 1]:
left = i + 1
break
t1, t2 = fruits[left], fruits[right]
res = max(res, right - left + 1)
return res