題目:
和諧數組是指一個數組里元素的最大值和最小值之間的差別正好是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;
}
-------------------------------小白學算法