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;}
};