java - 我该如何解决这个问题,如果有的话,什么样的算法适合解决它
问题描述
有一个包含非负整数的数组。我需要找到一个包含总和等于给定数字(目标)的数字的子数组(如果有的话)。我编写了这个有效的代码,但我尝试以更有效的方式编写它(O(n))。
public static void solvedNotSoEnhanced(int[] arr, int target) {
for (int i = 0; i <= arr.length-1;i++) {
int cur_sum = 0;
for (int j = i ; j <= arr.length-1; j++) {
cur_sum += arr[j];
if (cur_sum > target) {
break;
} else if (cur_sum == target) {
System.out.println("start: " + i + " end: " + j);
}
}
}
}
解决方案
诀窍在于限制:
有一个包含非负整数的数组。
这意味着当您从前到后遍历输入时,您假定子数组的“开始”位于索引 0 处,然后您开始按顺序添加每个数字。由于该限制,只有 3 个选项:
- 添加新数字会导致总和小于所需数字。在这种情况下,继续前进。
- 添加新号码会导致与所需号码完全匹配。您已经找到了子序列并且算法完成了。
- 添加新数字会导致总和更多。在这种情况下,唯一的答案可能在于移动启动:元素 0不是解决方案的一部分。
因此:
static void solvedNotSoEnhanced(int[] arr, int target) {
if (target < 1) {
// Always mind your corner cases!
System.out.println("(0, 0)");
return;
}
int start = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
while (sum > target) {
// Target exceeded; move up our startpoint.
sum -= arr[start];
start++;
}
// If we get here, we found our subsequence!
if (sum == target) {
System.out.println("[" + start + ", " + i + "]");
return;
}
}
return "No subsequence";
}
推荐阅读
- c# - 与其使用 single() 返回表中的一项,如何返回与列表中相同 ID 绑定的多个项?
- java - Kotlin 和 Springboot 中的 CORS 预检错误
- google-apps-script - Google Apps 脚本函数给出错误“异常:那些行超出范围。” 删除行时
- python - 从 url 保存图像的名称
- r - 如何像 actionButton 一样使用 selectInput?
- ruby - 对块应用细化
- ffmpeg - 如何在不停止广播的情况下用另一个替换当前的 ffmpeg 命令
- vue.js - NuxtJS 存储状态变量不断返回 undefined
- python - 使用 Selenium Python 找不到按钮
- chart.js - 实施现金流时间表