zoukankan      html  css  js  c++  java
  • 594. Longest Harmonious Subsequence

    本题题意:
    在一个数组中,找一个这样的和谐数组,他们的最大值和最小值的差值正好是1.
    Input: [1,3,2,2,5,2,3,7]
    Output: 5
    Explanation: The longest harmonious subsequence is [3,2,2,2,3].

    就是可以还是不连续的。

    第一遍写:

        Map<Integer, Integer>  dc = new HashMap<>();
            int res = 0;
            for (int i = 0; i < nums.length; ++i){
                if (dc.containsKey(nums[i]) )    continue;
                else{
                    int tr = 1;
                    boolean h = false;
                    for (int j = i + 1; j < nums.length; ++j)
                        if (nums[j] == nums[i])
                            tr += 1;
                        else if(nums[j] == nums[i] + 1){
                            tr += 1;
                            h = true;
                        }
                    res = Math.max(res, h ? tr: 0);
                    
                    tr = 1;
                    h = false;
                    for(int j = i + 1; j < nums.length; ++j)
                        if (nums[j] == nums[i])
                            tr += 1;
                        else if(nums[j] == nums[i] - 1){
                            tr += 1;
                            h = true;
                        }
                    res = Math.max(res, h ? tr : 0);
                }
            }
            return res;
    

    上面的思路是:用Hash记录,nums[i]的最大harmonious序列长度
    下面修改hash,让他直接记录次数不是更好嘛,然后再算。
    第二遍写:

        Map<Integer, Integer>  dc = new HashMap<>();
            for (int i = 0; i < nums.length; ++i)
                if (dc.containsKey(nums[i]))    dc.put(nums[i], dc.get(nums[i]) + 1);
                else    dc.put(nums[i], 1);
            int res = 0;
            for (int i = 0; i < nums.length; ++i){
                if (dc.containsKey(nums[i] - 1))   res = Math.max(res, dc.get(nums[i] - 1) + dc.get(nums[i]));
                if (dc.containsKey(nums[i] + 1))   res = Math.max(res, dc.get(nums[i] + 1) + dc.get(nums[i]));
            }
            return res;
    

    然后又用python写了一遍.

    def findLHS(self, nums: List[int]) -> int:
            dc = collections.Counter(nums)
            #nums[i] : counts
            res = 0
            for key, c in dc.items():
                if dc[key - 1] != 0:    res = max(res, dc[key] + dc[key - 1])
                if dc[key + 1] != 0:    res = max(res, dc[key] + dc[key + 1])
            return res
    

    最后嘞,看答案感觉又菜鸡了,其实是不用判定key - 1的,为什么嘞?

    1. 因为只要他没有key - 1,这是当然不用判定的。
    2. 如果要是有key - 1,那么到了key - 1就算的是上一次的。一直到最后。
      然后,字典加入也有小技巧
    dc.put(num, dc.getOrDefault(num, 0) + 1);
    

    代码如下:

        Map<Integer, Integer>  dc = new HashMap<>();
            int res = 0;
            for (int num : nums)
                dc.put(num, dc.getOrDefault(num, 0) + 1);
            for (int num : nums)
                if (dc.containsKey(num + 1))   res = Math.max(res, dc.get(num + 1) + dc.get(num));   
            return res;
    
  • 相关阅读:
    VMware虚拟机网络桥接模式下无法与主机ping通解决办法
    (一)编写Bootloader程序应该注意的一些问题
    使用TrueSTUDIO和MDK编译器生成.bin文件
    Linux开发板通过串口与电脑上位机通信
    STM32知识点
    仿真器SWD可不接复位引脚的原因
    ARM内核常用缩写含义
    三大范式(转)
    修改主键示例
    ROW_NUMBER用法详解
  • 原文地址:https://www.cnblogs.com/whyaza/p/10860590.html
Copyright © 2011-2022 走看看