滑动窗口-7

1652. 拆炸弹

题目来源:1652. 拆炸弹 - 力扣(LeetCode)

分析:

        1. 窗口固定为k 只不过移动方向随k对正负变化

        2. 我区分了 k > 0 and k < 0 的情况

        3. 在不同方向上进行逻辑移动,不用方向也移动的逻辑还不同,所以花费了比较多的时间来做这道“简单题”

我的解答:

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        if k == 0:
            return [0 for i in range(len(code))]
        
        if k > 0:
            ans = []
            ans_tmp = 0
            last_num = 0
            left = 0
            for right,num in enumerate(code):
                # in
                ans_tmp += num
                left = right + 1 - k
                if left < 0:
                    continue
                # update
                if left == 0:
                    last_num = ans_tmp
                else:
                    ans.append(ans_tmp)
                # out
                ans_tmp -= code[left]

            for right in range(k - 1):
                # in 
                ans_tmp += code[right]
                left = right + 1 - k
                ans.append(ans_tmp)
                ans_tmp -= code[left]
            ans.append(last_num)
            return ans
        else:
            ans = [0 for i in range(len(code))]
            ans_tmp = 0
            left = -1
            for right in range(-1,-len(code),-1):
                # in
                ans_tmp += code[right]
                left = right - 1 - k
                if left >= 0:
                    continue
                ans[left + 1] = ans_tmp
                ans_tmp -= code[left ] 
            for right in range(0,k,-1):
                ans_tmp += code[right]
                left = right - k
                ans[left] = ans_tmp
                ans_tmp -= code[left - 1]
            return ans

题解:

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = [0] * n
        r = k + 1 if k > 0 else n  # 第一个窗口的右开端点
        k = abs(k)
        s = sum(code[r - k: r])  # ans[0]
        for i in range(n):
            ans[i] = s
            s += code[r % n] - code[(r - k) % n]
            r += 1
        return ans

 总结:

        1. 找规律

        2. 我想我没有找到题解这个规律,应该是刷的题目,太少了,就导致解题思路以及思维方式比较局限

        3. 题解上面还有一个作者的分析思路,我认为该分析方法十分重要,通过手绘来寻找算法规律,然后开始敲代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值