##697 数组的度
class Solution {
public int findShortestSubArray(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<>();
int n = nums.length;
// for(int num:nums){
// map.put(num, map.getOrDefault(map.get(num),0)+1);
// } 这种出错了
for(int i=0;i<n;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
int maxCnt = 0;
for (int num : nums) {
maxCnt = Math.max(maxCnt, map.get(num));
}
// int maxCnt = Collections.max(map.values());
// 双指针
int len = 0;
int minlen = Integer.MAX_VALUE;
for(Map.Entry<Integer, Integer> aa : map.entrySet()){
int a = aa.getKey();
if(aa.getValue() == maxCnt){
int j = 0 , k = n-1;
while(nums[j] != a) j++;
while(nums[k] != a) k--;
len = k - j + 1;
minlen = Math.min(minlen,len);
}
}
return minlen;
}
}
思路
- HashMap统计一下数组中各个出现的次数
- 问题:不知道怎么找到key对应的value
在代码实现中, 我们需要遍历哈希表中对应的所有的值, 来寻找数组的度 和 最短连续子数组长度. 这里是利用Map.entrySet()来实现的, 可能很多朋友对此方法还是比较陌生的, 我们来介绍一下.
在介绍方法之前, 我们首先介绍下Map.Entry这个类. 它是Map中的一个内部类, 表示一个映射项, 映射项包含Key和Value (我们常说的键值对, 每一个键值对也就是一个Entry类), Map.Entry里面包含getKey()和getValue()方法. 用来获取相应的 键和值.
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
```