189. 轮转数组 - 力扣(LeetCode)
向右轮转将使尾部k个元素顶到头部
将整个数组反转,再分别反转前k个元素和剩下的元素即可
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin() + k);
reverse(nums.begin() + k, nums.end());
}
};
考虑直接将元素向后移动k位,因为移动覆盖将导致数据丢失,所以我们需要将“即将被覆盖的数据”保存起来
需要移动的次数?k %= 数组长度,数组长度 / k + 1就是需要移动的次数
对前k - 1个数进行移动即可
560. 和为 K 的子数组 - 力扣(LeetCode)
前缀和+查找,用mp记录每个位置上的前缀和出现了几次
若当前的前缀和为pre,则ans += mp[pre - k]
需要注意的是,0个元素的前缀和为0
class Solution {
public:
int subarraySum(vector<int>& nums, int k) {
int pre = 0, ans = 0;
unordered_map<int, int> mp;
mp[0] ++ ;
for (int i = 0; i < nums.size(); ++ i)
{
pre += nums[i];
ans += mp[pre - k];
mp[pre] ++ ;
}
return ans;
}
};