当前位置: 首页 > 知识库问答 >
问题:

给定一个数组和一个和,求小于和的连续子数组的最大长度

萧允晨
2023-03-14

我有一个数组[1,2,3],总和为4。所以所有的连续子数组都是 [1],[1,2][2,3] 和 [1,2,3]。因此,小于或等于总和的最大长度子数组为 [1,2],长度为 2。

我用下面的方法找到了所有的子数组,并检查了子数组的和,如下所示。但是这种方法不适用于负数。{1,2,1,1,3,-2,-3,7,9};答:7

 private static void maximumSubArray(int[] a, int sum) {

    int start = 0;
    int end =0;
    int mylen =-1;
    int subarrSum =0;
    for(int i=0;i<a.length;i++){
        subarrSum += a[i];
        end++;
        while(subarrSum > sum){
            subarrSum-= a[start];
            start +=1;

        }

        mylen = Math.max(mylen, end-start);
    }
    System.out.println(mylen + "  -- My len");

}

共有1个答案

南门鸿畴
2023-03-14

这是经典最大连续子数组问题的变体。您可以使用动态规划(记忆)来解决这个问题。尝试这样做:

private static void maximumSubArray(int[] a, long sum, int maxLen) {
    long maximumSoFar = Long.MIN_VALUE;
    long maximumEndingHere = Long.MIN_VALUE;
    for (int i = 0; i < a.length; i++) {
        // if you're inside the array beyond maxLen, start dropping off the previous start element
        int prevStart = i >= maxLen ? a[i - maxLen] : 0;
        maximumEndingHere = Math.max(a[i], maximumEndingHere + a[i] - prevStart);
        if (maximumEndingHere > maximumSoFar && maximumEndingHere <= sum) {
            maximumSoFar = maximumEndingHere;
        } else if (a[i] > maximumSoFar && a[i] <= sum) {
            maximumSoFar = a[i];
        } else if (maximumEndingHere > sum) {
            maximumEndingHere -= prevStart;
        }
    }
    System.out.println(maximumSoFar);
}

如果我有更多的时间,我会以更清晰的方式在for循环内部编写逻辑,但这应该有效,并且在O(n)时间内工作。

 类似资料:
  • 本文向大家介绍求一个数组中连续子向量的最大和相关面试题,主要包含被问及求一个数组中连续子向量的最大和时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组    

  • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

  • 这个问题有多项式解吗?如果有,你能呈现吗?

  • 你是一个电视游戏节目的参与者,这给了你赢得奖金的机会。在游戏中,你会看到一系列框,每个框都包含一个允许你看到的正整数值。你有机会选择任何数量的盒子。您的总奖金是您选择包含的所有盒子的总和。这个游戏只有一个限制:如果你选择了两个连续的盒子,你不允许在总数中添加任何后续的盒子,而你的奖品是截至该点的累计金额。你的目标是最大化你的奖金。 给定一个正整数数组,代表游戏中呈现给你的每个盒子的值,返回你能赢得

  • NowCoder 题目描述 {6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 解题思路 // java public int FindGreatestSumOfSubArray(int[] nums) { if (nums == null || nums.length == 0) return 0;

  • 一、题目 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例子说明: 例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和18 。 二、解题思路 解法一:举例分析数组的规律。 我们试着从头到尾逐个累加示例数组中的每个