题目

image.png

解题思路

  1. 哈希表
  2. 滑动窗口

    数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

  1. public int findLHS(int[] nums) {
  2. /**
  3. 将之存在map中,如果存在差是1,则是临近的两个值的出现次数加和
  4. */
  5. int max = 0;
  6. HashMap<Integer,Integer> map = new HashMap<>();
  7. for(int i = 0; i < nums.length; i++) {
  8. map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
  9. }
  10. for(Integer key : map.keySet() ) {
  11. if(map.containsKey(key - 1)) {
  12. max = Math.max(map.get(key - 1) + map.get(key), max);
  13. }
  14. if(map.containsKey(key + 1) ) {
  15. max = Math.max(max, map.get(key) + map.get(key + 1) );
  16. }
  17. }
  18. return max;
  19. }
  1. class Solution {
  2. public int findLHS(int[] nums) {
  3. //排序
  4. Arrays.sort(nums);
  5. //左指针
  6. int left = 0;
  7. //最大值
  8. int max = 0;
  9. for(int right = 0; right < nums.length; right ++) {
  10. while( nums[right] - nums[left] > 1) left++; //前面已经排好序,故当不符合时,更新窗口左边界
  11. if(nums[right] - nums[left] == 1) { //最大值减去最小值为1
  12. max = Math.max(max,right - left + 1); // 记录此时的最大次数
  13. }
  14. }
  15. return max;
  16. }
  17. }