leetcode-697
题目:
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
解题思路:
(1)记录数组元素的频数
(2)记录数组元素的起始位置和结束位置
(3)找出频数最大的元素,并计算其最短连续子数组的长度
(4)返回数组的最短连续子数组的长度
第一次的解法:
class Solution { public int findShortestSubArray(int[] nums) { HashMap<Integer, Integer> Frequency = new HashMap<Integer, Integer>();//记录频率 HashMap<Integer, Integer> leftSite = new HashMap<Integer, Integer>();//记录左边位置 HashMap<Integer, Integer> rightSite = new HashMap<Integer, Integer>();//记录右边位置 int count = nums.length; Integer v = 0; //初始化 for(int i = 0; i < nums.length; i++) { Frequency.put(nums[i], 0); leftSite.put(nums[i], -1); rightSite.put(nums[i], -1); } //统计每个数字出现频率 for(int i = 0; i < nums.length; i++) { for(Integer j : Frequency.keySet()) { if(j == nums[i]) { Frequency.replace(j, Frequency.get(j) + 1); //起始位置 if(Frequency.get(j) == 1) { leftSite.replace(j, i); } //结束位置 if(i > rightSite.get(j)) { rightSite.replace(j, i); } } } } //找到出现最大的频率 for(Integer value : Frequency.values()) { if(value >= v) v = value; } //在频率最大的元素中寻找最短连续子数组的长度 for(Integer i : Frequency.keySet()) { if(Frequency.get(i).equals(v)) { int cur = rightSite.get(i) - leftSite.get(i) + 1; if(cur < count) { count = cur; } } } return count; } }
运行结果:

注:学习了HashMap的基本用法:
创建HashMap对象 HashMap<keyType, valueType> functionName = new HashMap<keyType, valueType>;
添加key-value元素 put()
获取value值 get(key)
HashMap循环 for(keyType i : functionName.keySet())
for(valueType value : functionName.values())
判断value值是否相等 equals()
后期改进的方向:
(1)将value创建成数组形式,三个HashMap合并成一个
(2)寻找更优化的方法

浙公网安备 33010602011771号