更多滑动窗口的例题见我之前的博客
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);
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)){
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};
}