有人能为下面的问题提出一个简单的解决方案吗?
最长子数组:查找子数组中元素之和小于或等于“k”的最长连续子数组的长度。
输入为:< code>array和< code>k。
例子:
Array = {1,2,3}, k = 3
输出:
2个
解释:
子数组:{1},{2},}3},1,2},2,3},{1,2,3}
{1,2} =
一种有效的方法是使用动态规划,以减少求和操作的数量。例如,如果您求和(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;
}
最简单、最朴素的答案是遍历数组,找到从当前索引开始的最长子数组。
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
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}是结果子数组。