一个模板搞定滑动窗口 632.最小区间

更多滑动窗口的例题见我之前的博客


632.最小区间

在这里插入图片描述

public static int[] smallestRange(List<List<Integer>> nums){
   if(nums == null || nums.size() == 0) return new int[2];
   int minVal = Integer.MAX_VALUE,maxVal = Integer.MIN_VALUE;
   Map<Integer,List<Integer>> map = new HashMap<>();
   for (int i = 0;i < nums.size();i++){//先确定个范围,找出列表中最大值和最小值
       for (int val : nums.get(i)){
           List<Integer> inNums = map.getOrDefault(val, new LinkedList<>());
           inNums.add(i);
           map.put(val,inNums);//Map的Key是数值,Values是一个列表,里面存的是该数值在nums的哪个列表中有
           if (val < minVal)
               minVal = val;
           if (val > maxVal)
               maxVal = val;
       }
   }

   int[] needs = new int[nums.size()];
   int left = minVal,right = minVal;
   int valid = 0;
   int minLeft = 0,minLen = Integer.MAX_VALUE;
   while (right <= maxVal){

       while (right <= maxVal && valid != nums.size()){//窗口扩展
           int key = right;
           right++;
           if (map.containsKey(key)){
               for (int pos : map.get(key)){//取出List
                   needs[pos]++;
                   if (needs[pos] == 1)//如果某个列表中的数值有一个在窗口中
                       valid++;
               }
           }
       }

       while (left < right && valid == nums.size()){//窗口收缩
           //
           if (right - left < minLen){
               minLen = right-left;
               minLeft = left;
           }
           //
           int key = left;
           left++;
           if (map.containsKey(key)){
               for (int pos : map.get(key)){
                   needs[pos]--;
                   if (needs[pos] == 0)
                       valid--;
               }
           }
       }
   }
   return minLen == Integer.MAX_VALUE ? new int[2] : new int[]{minLeft,minLeft+minLen-1};
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值