给定一个大小为N的非负整数的未排序数组,找到一个与给定数S相加的连续子数组。
输入:
输入的第一行包含一个整数T,表示测试用例的数量。接下来是T测试用例。每个测试用例由两行组成。每个测试用例的第一行是N和S,其中N是数组的大小,S是和。每个测试用例的第二行包含N个表示数组元素的空格分隔整数。
输出:
对于每个测试用例,在新行中,如果sum等于子数组,则从左侧打印第一个出现子数组的开始和结束位置(1索引),否则打印-1。
约束条件:
1 <= T <= 100
1 <= N <= 107
1 <= Ai <= 1010
示例:
输入:
2
5 12
1 2 3 7 5
10 15
1 2 3 4 5 6 7 8 9 10
输出:
2 4
1 5
我的代码:
#include <iostream>
using namespace std;
int main() {
int t, n, s, a[1000], result[1000];
cin >> t;
for (int i = 0; i < t; i++) {
result[i * 2] = -1;
cin >> n >> s;
for (int j = 0; j < n; j++) {
cin >> a[j];
}
int flag = 0;
for (int j = 0; j < n; j++) {
if (flag == 0) {
int sum = 0;
for (int k = j; k < n && sum < s; k++) {
sum += a[k];
if (sum == s) {
result[i * 2] = j + 1;
result[(i * 2) + 1] = k + 1;
flag = 1;
break;
}
}
}
}
}
for (int i = 0; i < t * 2; i += 2) {
if (result[i] != -1) {
cout << result[i] << " " << result[i + 1] << endl;
} else {
cout << result[i];
}
}
}
结果:
错误答案。!!!错误答案
对于多个测试用例(TCs),您的代码可能无法正常工作。
代码失败的第一个测试用例:
输入:
4 225
9 45 10 190
其正确输出为:
-1
您的代码输出为:
-1-1-1-138 42
我刚刚发现了这个:https://www.youtube.com/watch?v=G0ocgTgW464但是我相信时间复杂度是O(n*log(n)),因为map::find是O(log(n))
问题陈述如下: 当帖子说解决方案对负数不起作用时,它指的是哪些输入情况?
问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准
我知道一个O(n2)soln,它能以更好的方式实现吗,因为数组中元素的数量限制非常大
我正在练习一些动态规划问题,并试图解决用给定的和打印所有子集的问题。例如:对于和,我应该得到以下结果: 我在不使用表的情况下得到了所需的结果,我使用表来防止重复调用相同的表和求和。但是,当使用表时,我在输出中没有得到。 请帮忙!
我试图找到一种算法(不是matlab命令)来枚举所有可能的NxM矩阵,其约束条件是每个单元格中只有正整数(或0)以及每行和每列的固定和(这些是算法的参数)。 例:枚举所有2x3矩阵,行总计为2,1,列总计为0,1,2: 这是一个相当简单的例子,但是随着N和M的增加,以及总和的增加,可能会有很多可能性。 编辑1 我可能有一个有效的安排来启动算法: target_row_sum[i]是第一行的预期金额
给定矩阵(大小by)和幂,(例如,4),产生矩阵,其中每个-th矩阵包含所有中的列在该程度上的可能组合。 在我当前的方法中,我生成-th矩阵,然后在下一次调用中使用它来生成th矩阵。对于给定的功率,这是否可以“自动”完成,而不是手动完成? 说到R,我是一个新手,我明白有可能比下面的尝试更有效、更优雅地实现这个解决方案。。。 有人能提供一些建议吗?我的目标是为给定的矩阵创建一个函数,并以更“自动化”