算法小知识----11.21----最长和谐子序列

157 阅读2分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

最长和谐子序列

该题出自力扣的594题——最长和谐子序列(简单题),题解消化于评论区

审题

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

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

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

  • 简单概括就是给一个数组,找出其中最大值和最小值的差为1 的子数组长度

  • 方法很多,这边采用了类似双指针的方法去实现

    • 先对数组排序,排序后可以采用双指针,否则就需要对每个数据进行比对
    • 循环遍历数组,数组内再次指定指针while循环,找出是否存在两个元素之间差值为1
    • 找到差值为1 的元素后,对结果集进行最大比较

编码

    public static int findLHS(int[] nums) {
        Arrays.sort(nums);
        int target = 0;
        int begin = 0;
        for (int i = 0;i<nums.length;i++){
            while (nums[i] - nums[begin] > 1){
                begin++;
            }
            if (nums[i] - nums[begin] == 1){
                target = Math.max(target,i-begin+1);
            }
        }
        return target;
    }

1637374835(1).jpg

最大子序和

该题出自力扣的53题——最大子序和(简单题),题解消化于评论区

审题

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

  • 清晰明了的题目,就是找到子数组的最大和

  • 该题只需要找到相关的规律即可,无需过度关注子数组的本身

    • 如果相加的总数 = 负数,那么就需要重新定义起始值
    • 当前总值与res取最大值

编码

该解法最为巧妙之处就在于忽略了子序列的查找对比,利用规律找到答案,对于最大子序列来说,从头到尾都是正数是最大的,只需要找到和的最大值,当和的值为负数时,就证明后续序列已经不再是最大的子序列和了,需要重新定义序列的首值

    public static int maxSubArray(int[] nums) {
        //数组nums
        int sum = nums[0];
        int res = 0;
        for (int num :
                nums) {
            if (sum > 0){
                sum += num;
            }else {
                sum = num;
            }
            res = Math.max(res,sum);
        }
        return res;
    }

1637377633(1).jpg