从Leetcode 每日一题练习继续讨论:
1652. 拆炸弹
1652. Defuse the Bomb
题解
本题是简单题,题目场景的设置非常有意思,题目本身只需按照题面将对应的数字按条件替换,只要了解循环数组即可,因为本题要么使用ith后面的k个数字要么使用ith前面的k个数字,即窗口大小是固定的,因此可使用滑动窗口。当k大于0时,从头遍历数组向后滑动,k小于0则从尾部遍历数组向前滑动,使用滑动窗口每次去掉一个数字再加上新加入窗口的数字即得当前窗口内的数字和。可以避免重复计算已有的部分数字和。
代码
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int n = code.size();
if (k == 0) {
return vector<int>(n, 0);
} else if (k > 0) {
int sumnow = 0;
vector<int> result;
for (int i = 1; i <= k; i++) {
sumnow += code[i];
}
for (int j = 1; j <= n; j++) {
result.push_back(sumnow);
sumnow -= code[j % n];
sumnow += code[(j + k) % n];
}
return result;
} else {
k = -k;
int start = n - k;
int end = n - 1;
int sumnow = 0;
vector<int> result;
for (int i = start; i <= end; i++) { // Calculate initial sum
sumnow += code[i];
}
for (int j = 0; j < n; j++) {
result.push_back(sumnow);
sumnow -= code[(j + n -k)%n];
sumnow += code[j];
}
return result;
}
}
};