滑动窗口-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 = 0last_num = 0left = 0for right,num in enumerate(code):# inans_tmp += numleft = right + 1 - kif left < 0:continue# updateif left == 0:last_num = ans_tmpelse:ans.append(ans_tmp)# outans_tmp -= code[left]for right in range(k - 1):# in ans_tmp += code[right]left = right + 1 - kans.append(ans_tmp)ans_tmp -= code[left]ans.append(last_num)return anselse:ans = [0 for i in range(len(code))]ans_tmp = 0left = -1for right in range(-1,-len(code),-1):# inans_tmp += code[right]left = right - 1 - kif left >= 0:continueans[left + 1] = ans_tmpans_tmp -= code[left ] for right in range(0,k,-1):ans_tmp += code[right]left = right - kans[left] = ans_tmpans_tmp -= code[left - 1]return ans
题解:
class Solution:def decrypt(self, code: List[int], k: int) -> List[int]:n = len(code)ans = [0] * nr = 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] = ss += code[r % n] - code[(r - k) % n]r += 1return ans
总结:
1. 找规律
2. 我想我没有找到题解这个规律,应该是刷的题目,太少了,就导致解题思路以及思维方式比较局限
3. 题解上面还有一个作者的分析思路,我认为该分析方法十分重要,通过手绘来寻找算法规律,然后开始敲代码