其他分享
首页 > 其他分享> > 最长和谐数组

最长和谐数组

作者:互联网

1、和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

【解题思路一】
先将数组排序,以为下标为j元素作为滑动窗口的右边界,下标为i的元素作为左边界,移动滑动窗口,统计最大值。

class Solution {
    public int findLHS(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        int i = 0;
        for(int j = 0; j < nums.length; j++){
            while(i < j && nums[j] - nums[i] > 1) i++;
            if(nums[j] - nums[i] == 1){
                ans = Math.max(ans, j - i + 1);
            }
        }
        return ans;

    }
}

【解题思路二】
遍历数组, 统计每个数字出现的次数,再次遍历数组,统计每个数x,x+1 和 x-1出现的次数,分别统计,然后取最大值。

class Solution {
    public int findLHS(int[] nums) {
        // Arrays.sort(nums);
        // int ans = 0;
        // int i = 0;
        // for(int j = 0; j < nums.length; j++){
        //     while(i < j && nums[j] - nums[i] > 1) i++;
        //     if(nums[j] - nums[i] == 1){
        //         ans = Math.max(ans, j - i + 1);
        //     }
        // }
        // return ans;
        HashMap<Integer, Integer> map = new HashMap<>();
        int ans = 0;
        for(int i : nums){
            if(map.containsKey(i)){
                map.put(i, map.get(i) + 1);
                continue;
            }
            map.put(i, 1);
        }

        for(int i : nums){
            if(map.containsKey(i + 1)){
                ans = Math.max(ans, map.get(i) + map.get(i + 1));
            }
            if(map.containsKey(i - 1)){
                ans = Math.max(ans, map.get(i) + map.get(i - 1));
            }
        }
        return ans;

    }
}

标签:map,数组,nums,int,get,和谐,ans,最长
来源: https://www.cnblogs.com/xmuBaron/p/15582934.html