leetcode 697. 数组的度
作者:互联网
题目
思路:
- 遍历并统计每种数据出现的大小,并记录当数第一次出现的位置和最后出现的位置
- 这里若用hash数组需要定义 hash[5000][3] 第一列存储出现的次数,第二列和第三列存储第一次和最后一次出现的位置而且遍历起来,但hash数组需要开的空间太大会造成空间上的浪费
- 我们可以使用Map<Integer,int[]> 来替代多行多列的数组。
注意:
- 不要将hash思想限制在两列,hash映射可以映射多列数据
- 如果当前数是最大于(不等于)最大值,直接返回长度,等于的情况再取最小值
法一:
class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
int n = nums.length;
for (int i = 0; i < n; i++) {
if (map.containsKey(nums[i])) {
map.get(nums[i])[0]++;
map.get(nums[i])[2] = i;
} else {
map.put(nums[i], new int[]{1, i, i});
}
}
int maxNum = 0, minLen = 0;
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
int[] arr = entry.getValue();
if (maxNum < arr[0]) {
maxNum = arr[0];
minLen = arr[2] - arr[1] + 1;
} else if (maxNum == arr[0]) {
if (minLen > arr[2] - arr[1] + 1) {
minLen = arr[2] - arr[1] + 1;
}
}
}
return minLen;
}
}
法二:
class Solution {
public static int findShortestSubArray(int[] nums) {
int[][] hash=new int[50000][3];
for(int i=0;i<nums.length;i++){
//0列记录出现的次数
if(hash[nums[i]][0]==0){
hash[nums[i]][1]=i;
hash[nums[i]][2]=i;
}else{
hash[nums[i]][2]=i;
}
hash[nums[i]][0]++;
}
int max=0;
int min=50000;
for(int i=0;i<nums.length;i++){
if(hash[nums[i]][0]==max){
min=Math.min((hash[nums[i]][2]-hash[nums[i]][1]+1),min);
}
if (hash[nums[i]][0]>max){
max=hash[nums[i]][0];
min=hash[nums[i]][2]-hash[nums[i]][1]+1;
}
}
return min;
}
}
标签:map,arr,hash,697,nums,int,min,数组,leetcode 来源: https://blog.csdn.net/qq_51131591/article/details/121465553