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

最长的子阵列

陈修诚
2023-03-14

有人能为下面的问题提出一个简单的解决方案吗?

最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。

输入为:< code>array和< code>k。

例子:

Array = {1,2,3}, k = 3

输出:

2个

解释:

子数组:{1},{2},}3},1,2},2,3},{1,2,3}

{1,2} =

共有3个答案

商畅
2023-03-14

一种有效的方法是使用动态规划,以减少求和操作的数量。例如,如果您求和(1 2)=3,您不想再次求和(1 2 3)=6,您只希望求和(3 3)=6(其中前3已经计算并保存到哈希图中)。在这个解决方案中,哈希图表示从indexi到indexj的总和,格式为

    static int maxLength(int[] a, int k) {
        Map<Integer, Map<Integer, Long>> map = new HashMap<Integer, Map<Integer, Long>>();

        int maxLength = 0;
        for(int i = 0; i < a.length - 1; i++) {
            Map<Integer, Long> map2 = new HashMap<Integer, Long>();
            map2.put(i, (long)a[i]);
            map.put(i, map2);
            if(a[i] == k) {
                maxLength = 1;
            }
        }

        for(int l = 2; l <= a.length; l++) {
            long sum = 0;
            for(int i = 0; i <= a.length - l; i++) {
                int j = i + l - 1;
                Map<Integer, Long> map2 = map.get(i);
                sum = map2.get(j - 1) + a[j];
                map2.put(j, sum);

                if(sum <= k) {
                    if(l > maxLength) {
                        maxLength = l;
                    }
                }
            }
        }

        return maxLength;
    }

费德宇
2023-03-14

最简单、最朴素的答案是遍历数组,找到从当前索引开始的最长子数组。

int[] a = { 1,2,3,1,1,2,3,1,3 };
int k = 4;

int best_i = 0; // from index
int best_j = 0; // to index, so best length = j - i + 1
int best_sum = 0;

for (int i = 0; i < a.length; i++) { // starting index from beginning to end 
    int sum = 0;
    for (int j = i; j < a.length; j++) { // ending index from current to end
        sum += a[j];
        if (sum > k) break;
        if (j - i > best_j - best_i) { // best length found
            best_i = i;
            best_j = j;
            best_sum = sum;
        }
    }
}

System.out.println("best length = " + (best_j - best_i + 1) + " (indexes " + best_i + ".." + best_j + "), sum = " + best_sum);
// best length = 3 (indexes 3..5), sum = 4
濮阳宏硕
2023-03-14

O(n)方法。在高级别:

有2个指针开始结束开始是子数组的开始,结束是结束(独占)。用于保持子数组的整型求和。一个 int len 来保持子数组 len。

将两者都设置为位置0。

>

  • 继续移动end指针:

    while (end < arr.length && sum + arr[end] <= k) {
        sum += arr[end];
        end ++;
    }
    if ((end - start) > len ) {
      len = (end-start);
    }
    

    这将找到最长的子阵列与总和

    移动start

    sum -= arr[start];
    start++;
    

    返回到1,直到<code>end</code>通过数组的最后一个元素

    最后,您将找到最大长度(存储在len中)

    将某些边缘情况的处理留给您(例如,如果数组中有一个元素具有值

  •  类似资料:
    • 给定一个整数数组,包含不超过两个不同值的最长子数组的长度是多少,使得非重复值的差异不超过 1? 例: 最大的子数组长度为4:[1,2,1,2]。 最大的子阵列具有长度4:[3,3,2,2]。值1和3相差1以上,因此[1,1,1,3,3]无效。

    • A是一个数组,B是A中所有元素的质因数阶,< code>size(A)=N (1 到目前为止,我还没有想过这个问题,所以没有什么成就,但是我保证我已经想了很久了,希望有帮助,谢谢!

    • 我正在考虑这个leetcode问题,在完成这个天真的方法时遇到了一个问题。我在这里找到了一个最佳的解决方案。但我不确定我天真的尝试到底出了什么问题。 问题如下: 给定两个整数数组A和B,返回两个数组中出现的子数组的最大长度。 示例: 输入:A:[1,2,3,2,1]B:[3,2,1,4,7] 输出:3 说明:最大长度的重复子数组为[3,2,1]。 这是我当前的代码: 我的解决方案通过了几个测试用例

    • 我试图在c中实现最长公共子序列算法,矩阵c[]]存储最长公共子序列的长度,行[][]存储c[]]矩阵中的父块行,列[][]存储父块列。 我对解决LCS的方法非常不便和低效表示歉意,但什么都没有打印出来。请帮忙。

    • 我正在解决一个程序设计的挑战,在一个2D NxN矩阵中寻找最长的递增子序列的长度。在序列的每个元素中,行和列都必须增加(不需要连续)。本文用动态规划方法求解,但它是O(n^4),效率低。然而,在O(n^3)中有许多解。一种这样的解决办法是: 有人能解释一下它的工作原理或其他O(n^3)方法吗?我根本听不懂:(。

    • {4,5,1,5,7,6,8,4,1},答案是5。 对于第一个例子,子数组{5,3,1,4,2}排序后可以形成连续序列1,2,3,4,5,它们是最长的。 对于第二个示例,子数组{5,7,6,8,4}是结果子数组。