LeetCode697 数组的度
题目:给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
输入: [1,2,2,3,1,4,2]
输出: 6
-
标签:
数组
-
思路:
- 根据题意,对于数组中的每一个值,需要存储:第一次出现的位置(即下标),最后一次出现的位置(即下标),出现的次数。所以选择哈希表来存储,key为数组中的每一个值,value存储下标或次数。
- 遍历数组
第一次出现的位置:如果数组中的值不在left表的key中,即保存。
最后一次出现的位置:在遍历数组过程中不断添加或者更新。map.put()函数会更新key一样的value.
次数:集合中有这个key时,就使用这个key的value,没有就使用0。均+1 - 遍历count的key,找到count表中最大value,然后找到min(right[key]- left[key] +1)。(为什么不找最大value对应的key,因为这样的key可能不止一个)
- 代码实现
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class Solution {
private static int findShortestSubArray(int[] nums) {
//哈希表,left存储x和左下标,right存储x和右下标。count存储x和次数。
Map<Integer, Integer> left = new HashMap(),
right = new HashMap(), count = new HashMap();
//循环一次,即可得到所有的目标哈希表
for (int i = 0; i < nums.length; i++) {
int x = nums[i];
if(!left.containsKey(x)) {left.put(x,i);}
right.put(x,i);
count.put(x, count.getOrDefault(x ,0) + 1); //map集合中有这个key时,就使用这个key值,没有就使用0.均+1
}
int ans = nums.length;
//获取count表中最大的value。count.values()是一个Collections对象。调用max函数。
int degree = Collections.max(count.values());
//循环count表,找到最大value对应的key。right[key]-left[key] +1即为长度。
for (int x : count.keySet()) {
if(count.get(x) == degree) {
ans = Math.min(right.get(x) - left.get(x) +1, ans);
}
}
return ans;
}
//测试用例
public static void main(String[] args) {
int[] nums = {1,3,5,6,3,5,7}; //3,5的度均为最大值2.比较min.
int[] nums = {1,3,5,6,3,7,5};
int minLen = findShortestSubArray(nums);
System.out.println(minLen);
}
}
LeetCode66 加一
题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
- 标签:
数组
- 思路
- 特殊值:9。根据题意写出测试用例:9、29、92、99。
- 遍历数组时,从最后一位(个位)遍历。将第一个不是9的数+1返回。将遍历过的9位赋值为0。
- 代码实现
public class PlusOne {
private static int[] plusOne(int[] digits) {
int n = digits.length;
for (int i = n-1; i >= 0; i--) {
if (digits[i] != 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
int[] aims = new int[n+1];
aims[0] = 1;
return aims;
}
public static void main(String[] args) {
//int[] a = {9,9,9}
//int[] a = {2,9,9};
//int[] a = {9,2};
int[] a = {9};
int[] b = plusOne(a);
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
}
}