代码随想录 - Day2 - 双指针 / 快慢指针 + 滑动窗口

代码随想录 - 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值