9. 1652.拆炸彈(簡單,學習)
1652. 拆炸彈 - 力扣(LeetCode)
思想
為了獲得正確的密碼,你需要替換掉每一個數字。所有數字會?同時?被替換。
- 如果?
k > 0
?,將第?i
?個數字用?接下來?k
?個數字之和替換。 - 如果?
k < 0
?,將第?i
?個數字用?之前?k
?個數字之和替換。 - 如果?
k == 0
?,將第?i
?個數字用?0
?替換。
2.我的:
根據k的不同分三類情況討論,先把 ∣ k ∣ |k| ∣k∣長度窗口的和求出來,然后根據k的正負向右或向左滑動窗口。
注意向左滑動時要+n再取余,i=(i-1+n)%n
3.學習
全部向右滑動,但是因為k的正負導致窗口在i的左側或右側,即**開始窗口位置不同,但保證窗口右移,從0開始遍歷待賦值的元素i: - k>0,窗口為
[1,k+1)
- k<0,窗口為
[n-|k|,n) **通過記錄一個變量right來維護
[right-k,right)`的窗口,但是保持right++**(而不是right=(right+1)%n,因為要始終保持right-k>0),但是sum更新的時候通過%n將`[right-k,right)`映射到對應范圍內即可
代碼
1.我的
c++:
class Solution {
public:vector<int> decrypt(vector<int>& code, int k) {int n = code.size();vector<int> res(n);if (k == 0) {for (int i = 0; i < n; ++i)res[i] = 0;} else if (k > 0) {long long sum = 0;for (int i = 0; i < k - 1; ++i)sum += (long long)code[i];int i = k - 1;int cnt = 0;for (;; i = (i + 1) % n) {sum += (long long)code[i];if ((i - k + n) % n == n - 1) {cnt++;if (cnt == 2)break;}res[(i - k + n) % n] = sum;sum -= (long long)code[(i - k + 1 + n) % n];}} else {long long sum = 0;int len = -1 * k;for (int i = n - 1; i > n - len; --i)sum += (long long)code[i];int i = n - len;int cnt = 0;for (;; i = (i - 1 + n) % n) {sum += (long long)code[i];if ((i + len + n) % n == 0) {cnt++;if (cnt == 2)break;}res[(i + len + n) % n] = sum;sum -= (long long)code[(i + len - 1 + n) % n];}}return res;}
};
2.學習:
c++:
class Solution {
public:vector<int> decrypt(vector<int>& code, int k) {int n = code.size();vector<int> res(n);int right = k > 0 ? k + 1 : n;k = abs(k);// 初始窗口和long long sum = 0;for (int i = right - k; i < right; ++i)sum += code[i];// 遍歷賦值元素for (int i = 0; i < n; ++i) {res[i] = sum;sum -= code[(right - k + n) % n];sum += code[right % n];right++;}return res;}
};
10. 1176.健身計劃評估(簡單)
1176. 健身計劃評估 - 力扣(LeetCode)
思想
1.為了更好地評估這份計劃,對于卡路里表中的每一天,你都需要計算他 「這一天以及之后的連續幾天」 (共?k
?天)內消耗的總卡路里?T:
- 如果?
T < lower
,那么這份計劃相對糟糕,并失去 1 分; - 如果?
T > upper
,那么這份計劃相對優秀,并獲得 1 分; - 否則,這份計劃普普通通,分值不做變動。
代碼
c++:
class Solution {
public:int dietPlanPerformance(vector<int>& calories, int k, int lower,int upper) {int n = calories.size();int res = 0;long long sum = 0;for (int i = 0; i < n; ++i) {sum += calories[i];if (i < k - 1)continue;if (sum > upper)res++;else if (sum < lower)res--;sum -= calories[i - k + 1];}return res;}
};
11. 1100.長度為K的無重復字符子串
1100. 長度為 K 的無重復字符子串 - 力扣(LeetCode)
思想
1.給你一個字符串?S
,找出所有長度為?K
?且不含重復字符的子串,請你返回全部滿足要求的子串的?數目。
2.利用map來儲存字符個數,mp.size()==k
說明無重復字符
代碼
c++:
class Solution {
public:int numKLenSubstrNoRepeats(string s, int k) {int res = 0;map<int, int> mp;for (int i = 0; i < s.size(); ++i) {mp[s[i]]++;if (i < k - 1)continue;if (mp.size() == k)res++;mp[s[i - k + 1]]--;if (mp[s[i - k + 1]] == 0)mp.erase(s[i - k + 1]);}return res;}
};
1.mp.size()
統計key的數量
2.mp.erase(key)
,刪除鍵值對