leecode2962 统计最大元素出现至少K次的子数组

在这里插入图片描述

这个题型属于滑动窗口的题型,由于需要统计元素出现的次数,所以我们需要额外的数据结构map

我的思路

  1. 我首先找出了数组最大值

  2. 之后我对这个数组进行遍历,直到找到map.containsKey(max)&&map.get(max)>=k 此时我们对这个次数进行判断。

    1. 我最开始的判断是直接写一个循环,从0开始,直到遍历出来的max元素大于已经添加到map集合的max元素个数减去k的时候停止,但这种方式有个问题就是时间复杂夫很高,只通过了622/634个,后续这个优化想了好久也没想到怎么优化的,就先放弃了。直接看题解了

      public long countSubarrays(int[] nums, int k) {
          int max = 0;
          for (int x : nums) {
              max = Math.max(max, x);
          }
          int len = nums.length;
          int max=arr[len-1],count=0;
          Map<Integer,Integer> map = new HashMap<>();
      
          for(int right=0;right<len;right++){
              map.put(nums[right],map.getOrDefault(nums[right],0)+1);
              int left =0,count_temp=0;
              if(map.containsKey(max)&&map.get(max)>=k){
                  while (count_temp<=map.get(max)-k){
                      if(nums[left]==max){
                          count_temp++;
                      }
                      left++;
                      count++;
                  }
              }
          }
          return count;
      }
      
    2. 优化思路,把这个循环计数,转化为计数一次。

      for(int right=0;right<len;right++){
          map.put(nums[right],map.getOrDefault(nums[right],0)+1);
          while(map.containsKey(max)&&map.get(max)==k){
              if(nums[left]==max){
                  map.put(max,map.get(max)-1);
              }
              left++;
          }
          count+=left;
      }
      

灵神的思路

太强了,我太死板了,以为这种统计次数还是需要用map集合来做,但实际上,不需要,只需要一个计数器就行了,

class Solution {
    public long countSubarrays(int[] nums, int k) {
        int mx = 0;
        for (int x : nums) {
            mx = Math.max(mx, x);
        }

        long ans = 0;
        int cntMx = 0, left = 0;
        for (int x : nums) {
            if (x == mx) {
                cntMx++;
            }
            while (cntMx == k) {
                if (nums[left] == mx) {
                    cntMx--;
                }
                left++;
            }
            ans += left;
        }
        return ans;
    }
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/solutions/2560940/hua-dong-chuang-kou-fu-ti-dan-pythonjava-xvwg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值