• Leetcode594:最长和谐子序列


    原文链接:594. 最长和谐子序列 - 力扣(LeetCode)


    题目

            和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是 1 。

            现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。

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

    示例 1:

    输入:nums = [1,3,2,2,5,2,3,7]
    输出:5
    解释:最长的和谐子序列是 [3,2,2,2,3]

    示例 2:

    输入:nums = [1,2,3,4]
    输出:2

    示例 3:

    输入:nums = [1,1,1,1]
    输出:0

    提示:

    1 <= nums.length <= 2 * 104
    -109 <= nums[i] <= 109

    方法一

    解题思路
    1、遍历第一次nums,使用hashmap,记录每一个值及其出现的次数
    2、遍历第二次,判断有没有符合题意的一组元素
    3、如果有就将他们出现的次数加起来,更新最大值

    时间:18ms 空间:42.7MB

    1. class Solution {
    2.     public int findLHS(int[] nums) {
    3.         Map map = new HashMap<>();
    4.         //第一次循环,将nums中每一个值及其出现的次数,存入map中
    5.         for(int temp : nums){
    6.             if(map.containsKey(temp)){
    7.                 map.put(temp,map.get(temp)+1);
    8.             }
    9.             else map.put(temp,1);
    10.         }
    11.         int res=0;
    12.         for(int ans : nums){
    13.             //判断有没有比当前元素大1的元素
    14.             //如果有,则将他们对应的value值相加
    15.             //然后更新最大值
    16.             if(map.containsKey(ans+1)){
    17.                 res = Math.max(res,map.get(ans)+map.get(ans+1));
    18.             }
    19.             //if判断完,继续判断下一个元素
    20.         }
    21.         return res;
    22.     }
    23. }


    方法二

    解题思路
    1、由于该题顺序不影响结果,所以可以先排序
    2、利用滑动窗口的思想,不断更新指针
    3、满足题意,右指针right+1
    4、不满足题意,找到满足题意的第一个左指针left

    时间:13ms 空间:41.8MB

    1. class Solution {
    2.     public int findLHS(int[] nums) {
    3.         //因为差值总为1,所以顺序不影响结果
    4.         Arrays.sort(nums);
    5.         int Maxres = 0,left=0,right=0;
    6.         while(right
    7.             //当差值为1时,更新结果
    8.             if(nums[right]-nums[left]==1){
    9.                 Maxres=Math.max(Maxres,right-left+1);  
    10.             }
    11.             //差值不为1时,找到能使差值为1或0的左指针left
    12.             else{
    13.                 while(nums[right]-nums[left]>1){
    14.                     left++;
    15.                 }
    16.             }
    17.             //更新右指针
    18.             right++;
    19.         }
    20.         return Maxres;
    21.     }
    22. }

  • 相关阅读:
    java基于springboot +vue的图书馆图书借阅系统
    keil调试工具(调试技术)
    Datax抽取mysql的bit类型数据
    java栈和自定义栈
    【博士每天一篇文献-算法】Progressive Neural Networks
    Golang实现组合模式和装饰模式
    shell_53.理解Linux输入和输出
    【微信小程序开发(三)】实现卡片的层叠滑动
    Python TCP服务端多线程接收RFID网络读卡器上传数据
    某医疗机构:建立S-SDLC安全开发流程,保障医疗前沿科技应用高质量发展
  • 原文地址:https://blog.csdn.net/qq_52726736/article/details/127735498