• 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;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    webpack学习使用
    Netty系列(一):Springboot整合Netty,自定义协议实现
    在ubuntu让移动硬盘目录固定
    【NLP Learning】Transformer Encoder续集之网络结构源码解读
    瑞吉外卖项目实战Day01
    javaScript中循环遍历的方式有哪些
    77 全排列
    抖音店铺提供优质服务|成都瀚网科技
    操作系统中的进程是什么?(详细讲解进程调度相关PCB信息)
    这些负载均衡都解决哪些问题?服务、网关、NGINX?
  • 原文地址:https://blog.csdn.net/qq_44230700/article/details/127719038