标签:array ref 次数 出现 fast 缩小 shm ble 数组
https://leetcode-cn.com/problems/degree-of-an-array/
这个题跟昨天做的子串很相似哈,哈希表+滑动窗口完成。
class Solution { public int findShortestSubArray(int[] nums) { HashMap<Integer, Integer> map = new HashMap<>(); int max = Integer.MIN_VALUE; for (int num : nums) { map.put(num, map.getOrDefault(num, 0) + 1); max = Math.max(max,map.get(num)); } HashMap<Integer,Integer> cur = new HashMap<>(); int fast = 0; int slow = 0; int min = Integer.MAX_VALUE; while(fast < nums.length){ cur.put(nums[fast],cur.getOrDefault(nums[fast],0)+1); while(cur.get(nums[fast]).equals(max)){ min = Math.min(min,fast - slow + 1); cur.put(nums[slow],cur.get(nums[slow])-1); slow++; } fast++; } return min; } }
思路就是先把原来的数组的度找出来,就是出现最多的元素的次数,然后就进入滑动窗口,快指针一直访问到当前度数与原数组的度相等,就开始缩小左边界,直到度不再满足条件,这个做出来要29ms,只击败了50%的人。
后来看了看题目给的条件,数组长度最长是已知的,那么我们就不需要去用map统计长度了,直接开数组就完事。
class Solution { public int findShortestSubArray(int[] nums) { int[] count = new int[50000]; int max = Integer.MIN_VALUE; for (int num : nums) { count[num]++; max = Math.max(max,count[num]); } HashMap<Integer,Integer> cur = new HashMap<>(); int fast = 0; int slow = 0; int min = Integer.MAX_VALUE; while(fast < nums.length){ cur.put(nums[fast],cur.getOrDefault(nums[fast],0)+1); while(cur.get(nums[fast]).equals(max)){ min = Math.min(min,fast - slow + 1); cur.put(nums[slow],cur.get(nums[slow])-1); slow++; } fast++; } return min; } }
这次做完只需要19ms,击败87%的人
标签:array ref 次数 出现 fast 缩小 shm ble 数组
原文地址:https://www.cnblogs.com/ZJPaang/p/12950268.html