Leetcode简单题
题目:
和谐数组是指一个数组里元素的最大值和最小间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例 1:
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
解法 1(双指针):
小结:
先对数组进行排序,再定义左右两个指针,让右指针在数组中遍历,设定循环条件使得左指针与右指针的值相差不超过1,再判断左右指针的值相差是否为1,若为1,则求出下标的差值 + 1,即(子序列长度)。最后使用max()求出最大子序列长度。
public int findLHS(int[] nums) {
Arrays.sort(nums);
int res =0;
int l = 0;
for(int r = 0; r < nums.length; r++){
while(nums[r] - nums[l] > 1) l++;
if(nums[r] - nums[l] == 1){
res = Math.max(res,r - l + 1);
}
}
return res;
}
解法 2 (HashMap):
小结 :
定义一个HashMap,将数组中的值遍历赋给哈希表的键集合中,并调用getOrDefault方法实现计数(若传入的键值不存在则赋值为0),最终得到一个新的哈希表(键集合存在数组,值集合存放原数组同一元素的个数)。然后遍历键集合,判断如果该键+1存在,将求出该键值和该键+1值的和,即子序列长度。最后使用max()求出最大子序列长度。
public int findLHS(int[] nums) {
HashMap<Integer,Integer> count = new HashMap<>();
int res = 0;
for(int num : nums){
count.put(num,count.getOrDefault(num,0) + 1);
}
for(Integer k : count.keySet()){
if(count.containsKey(k + 1)){
res = Math.max(res,count.get(k) + count.get(k + 1 ));
}
}
return res;
}
personality
浙公网安备 33010602011771号