leetcode周赛第二题6230. 长度为 K 子数组中的最大和
题目: 给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:
子数组的长度是 k,且 子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。
子数组 是数组中一段连续非空的元素序列。
示例 1:
输入:nums = [1,5,4,2,9,9,9], k = 3 输出:15 解释:nums 中长度为 3 的子数组是:
- 
 [1,5,4] 满足全部条件,和为 10 。 [5,4,2] 满足全部条件,和为 11 。 [4,2,9] 满足全部条件,和为 15 。 [2,9,9] 不满足全部条件,因为元素 9 出现重复。 [9,9,9] 不满足全部条件,因为元素 9 出现重复。 因为 15 是满足全部条件的所有子数组中的最大子数组和,所以返回 15 。 示例 2:
 
输入:nums = [4,4,4], k = 3 输出:0 解释:nums 中长度为 3 的子数组是:
- 
 [4,4,4] 不满足全部条件,因为元素 4 出现重复。 因为不存在满足全部条件的子数组,所以返回 0 。
 
提示: 1 <= k <= nums.length <= 105 1 <= nums[i] <= 105
自我反思: 当时做的时候卡壳了,不知道怎么应对重复这个限制,想着用set,试了一下又卡住了23333,之后看了一下大佬题解,才知道用hash表
好了,言归正传,思路就是,滑动窗口+hashmap, 开始先把前k个数存入hash表并计数,同时对这k个数求和, 然后每滑动一下,把新元素加到hashmap中,当前窗口的最左端的元素,删掉,每次一增一删的同时,判断一下当前的元素个数是不是k个,如果是k个说明满足题目要求,把它和结果求一下最大值,以此类推。。
class Solution {
          
   
public:
    long long maximumSubarraySum(vector<int>& nums, int k) {
          
   
        unordered_map<int, int> mp;
        long long sum = 0;
        long long ans = 0;
        int n = nums.size();
        for(int i = 0;i < k;i ++) mp[nums[i]] ++, sum += nums[i];
        if(mp.size() == k) ans = max(ans, sum);
        
        int l = 0;
        for(int i = k;i < n;i ++){
          
       
            mp[nums[i]] ++, sum += nums[i];
            auto t = mp.find(nums[l]);  // 这里t是一个整体,key value
            if(t->second == 1) mp.erase(t);
            else t->second --;
            sum -= nums[l++];
            if(mp.size() == k) ans = max(ans, sum);
        }
        return ans;
    }
};
				       
			          下一篇:
			            排序系列之插入排序的两种思想 
			          
			        