最长和谐数组
作者:互联网
1、和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
【解题思路一】
先将数组排序,以为下标为j元素作为滑动窗口的右边界,下标为i的元素作为左边界,移动滑动窗口,统计最大值。
class Solution {
public int findLHS(int[] nums) {
Arrays.sort(nums);
int ans = 0;
int i = 0;
for(int j = 0; j < nums.length; j++){
while(i < j && nums[j] - nums[i] > 1) i++;
if(nums[j] - nums[i] == 1){
ans = Math.max(ans, j - i + 1);
}
}
return ans;
}
}
【解题思路二】
遍历数组, 统计每个数字出现的次数,再次遍历数组,统计每个数x,x+1 和 x-1出现的次数,分别统计,然后取最大值。
class Solution {
public int findLHS(int[] nums) {
// Arrays.sort(nums);
// int ans = 0;
// int i = 0;
// for(int j = 0; j < nums.length; j++){
// while(i < j && nums[j] - nums[i] > 1) i++;
// if(nums[j] - nums[i] == 1){
// ans = Math.max(ans, j - i + 1);
// }
// }
// return ans;
HashMap<Integer, Integer> map = new HashMap<>();
int ans = 0;
for(int i : nums){
if(map.containsKey(i)){
map.put(i, map.get(i) + 1);
continue;
}
map.put(i, 1);
}
for(int i : nums){
if(map.containsKey(i + 1)){
ans = Math.max(ans, map.get(i) + map.get(i + 1));
}
if(map.containsKey(i - 1)){
ans = Math.max(ans, map.get(i) + map.get(i - 1));
}
}
return ans;
}
}
标签:map,数组,nums,int,get,和谐,ans,最长 来源: https://www.cnblogs.com/xmuBaron/p/15582934.html