1652. 拆炸弹
分析:
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. 题解上面还有一个作者的分析思路,我认为该分析方法十分重要,通过手绘来寻找算法规律,然后开始敲代码