Leetcode简单题

Leetcode No.594 简单题


题目:

和谐数组是指一个数组里元素的最大值和最小间的差别 正好是 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
 

 

 

 

posted @ 2023-03-13 00:14  落"  阅读(43)  评论(0)    收藏  举报