本文主要是介绍每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;}
};
这篇关于每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!