1.题目链接:2460. 对数组执行操作 - 力扣(LeetCode)
题目思路:先对原始数组执行题目要求的操作,然后把数组中的非零数全部放进新数组,比较新数组与原始数组长度,在后面用0补上
class Solution {
public:
vector<int> applyOperations(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n - 1; i ++ ) {
if(nums[i] == nums[i + 1]) {
nums[i] = 2*nums[i];
nums[i + 1] = 0;
}
}
vector<int> nums1;
for(int i = 0; i < n; i ++ ) {
if(nums[i] != 0) nums1.push_back(nums[i]);
}
int m = nums1.size();
for(int i = m; i < n; i ++ ) nums1.push_back(0);
return nums1;
}
};
2.题目链接:2461. 长度为 K 子数组中的最大和 - 力扣(LeetCode)
题目思路:使用滑动区间与哈希表,通过哈希表确保遍历当前区间没有重复值时比较更新res值
class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
long long sum = 0;
unordered_map<int, int> mp;
for(int i = 0; i < k; i ++) {
mp[nums[i]] ++;
sum += nums[i];
} // 计算0 ~ k - 1中各个元素的个数,给定一个初始的窗口
long long res = 0;
if(mp.size() == k) res = sum; // 如果最开始的k个书中没有重复元素,把res初始为前k个数和
for(int i = k; i < nums.size(); i ++ ) {
mp[nums[i - k]] --;
mp[nums[i]] ++;
sum += nums[i] - nums[i - k]; // 一进一出,更新sum值
if(mp[nums[i - k]] == 0) mp.erase(nums[i - k]);
if(mp.size() == k) res = max(res, sum); // 如果满足当前区间未重复的要求,比较更新res值
}
return res;
}
};