1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
public class _697数组的度 {
public int findShortestSubArray_fast(int[] nums) { int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE; for (int num : nums) { max = Math.max(max, num); min = Math.min(min, num); }
int[][] map = new int[max - min + 1][]; int minLength = 1, maxDegree = 1; for (int i = 0; i < nums.length; i++) { int idx = nums[i] - min; int[] ints = map[idx]; if (ints == null) { ints = new int[]{1, i, i}; } else { ints[0]++; if (ints[0] < maxDegree) { ints[2] = i; } else if (ints[0] == maxDegree) { ints[2] = i; minLength = Math.min(minLength, ints[2] - ints[1] + 1); } else if (ints[0] > maxDegree) { maxDegree = ints[0]; ints[2] = i; minLength = ints[2] - ints[1] + 1; } } map[idx] = ints; } return minLength; }
public int findShortestSubArray_gov(int[] nums) { Map<Integer, int[]> map = new HashMap<Integer, int[]>(); int maxDegree = 1; int minLength = 1; for (int i = 0; i < nums.length; i++) { int[] node = map.getOrDefault(nums[i], new int[]{0, -1, -1}); node[0]++; if (node[0] == 1) { node[1] = i; } else if (node[0] < maxDegree) { node[2] = i; } else if (node[0] == maxDegree) { node[2] = i; minLength = Math.min(minLength, node[2] - node[1] + 1); } else if (node[0] > maxDegree) { maxDegree = node[0]; node[2] = i; minLength = node[2] - node[1] + 1; } map.put(nums[i], node); } return minLength; }
public int findShortestSubArray(int[] nums) { Map<Integer, List<Integer>> map = new HashMap<>(); List<Integer> maxNumList = new ArrayList<>(); int maxDegress = 0;
List<Integer> list; for (int i = 0; i < nums.length; i++) { int num = nums[i]; list = map.getOrDefault(num, new ArrayList<>()); list.add(i); map.put(num, list); if (maxDegress < list.size()) { maxDegress = list.size(); maxNumList = new ArrayList<>(); maxNumList.add(num); } else if (maxDegress == list.size()) { maxNumList.add(num); } }
int minLength = Integer.MAX_VALUE; for (Integer num : maxNumList) { List<Integer> indexList = map.get(num); minLength = Math.min(minLength, indexList.getLast() - indexList.getFirst() + 1); } return minLength; }
public static void main(String[] args) { _697数组的度 degree = new _697数组的度();
System.out.println(degree.findShortestSubArray_fast(new int[]{1, 2, 2, 3, 1, 4, 2})); } }
|