题目:
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
示例 1:
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
说明: 输入的数组长度最大不超过20,000.
思路1:
莽就完事了,嵌套循环。
leetcode超时。
代码如下:
public int findLHS(int[] nums) {
int max = 0;
for (int i = 0; i < nums.length; i++) {
int len = 0;
// 是有包含差值为1
boolean flag = false;
for (int j = 0; j < nums.length; j++) {
int abs = nums[j] - nums[i];
if (abs == 1) {
flag = true;
len++;
} else if (abs == 0) {
len++;
}
}
max = flag ? Math.max(len, max) : max;
}
return max;
}
思路2:
思路1的方式,时间复杂度O(N^2),超时。
先把字符归拢,并记录出现次数,存储到map中,key=i,val=count
遍历map的keyset,如果存在map.get(key + 1),那么此key的和谐子序列为map.get(key)+map.get(key+1)。
把每次的便利结果取最大值
代码如下:
public int findLHS1(int[] nums) {
// 记录每个数出现的次数
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : nums) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
// 遍历每个key和key+1比较
int max = 0;
for (Integer key : map.keySet()) {
if (map.containsKey(key + 1)) {
max = Math.max(map.get(key) + map.get(key + 1), max);
}
}
return max;
}
-------------------------------小白学算法