c++ - 我不明白如何使用嵌套循环计算每个可能子数组的总和
问题描述
作业问的问题是:
编写一个函数 secondSmallestSum ,当传递一个长度大于 1 的 int 数组时,将计算每个可能子数组的元素之和,然后返回找到的第二小的和。最小和次小的总和可能具有相同的值。
子数组是数组中元素的连续范围。例如,如果您有一个长度为 4 的数组 {1,2,3,4},那么完整的子数组集是:
{1},{1,2},{1,2,3},{1,2,3,4},{2},{2,3},{2,3,4},{3}, {3,4}、{4}
那么每个子数组的总和是:
1, 3, 6, 10, 2, 5, 9, 3, 7, 4
此问题的主函数必须调用您的 readNumbers 函数,然后将新数组传递给您的 secondSmallestSum 函数,显示找到的第二小的总和,最后删除该数组。
到目前为止,我的代码会打印用户输入的数字。
#include <iostream>
int *readNumbers(int n)
{
int *a = new int[n];
for (int i = 0; i < n; i++){
std::cin >> a[i];
}
return a;
}
int main()
{
int length = 5;
int *ptr = readNumbers(length);
printNumbers(ptr, length);
return 0;
}
我希望这个数组(示例){4,0,9} 输出 {4}、{4,0}、{4,0,9}、{0}、{0,9} 和{9}。每个数组的总和将输出为:4,4,13,0,9 和 9。总和为 39。
解决方案
乍一看,肯定会发生让我们运行一个双循环直到每个元素的数组末尾并找到元素的总和。
粗略地说,这给了你 O(n2) 的复杂性
现在,你想3+4
在你已经计算了第一次迭代的同时为第二次迭代添加(当你循环 2 时)?我不会...
因此,我会像这样保存这些增量添加:
for (int *i = ptr + l - 2; i >= ptr; i--) {
*i = *i + *(i+1);
}
这会给我{1,2,3,4} -> {10,9,7,4}
现在运行双循环:
for (int *i = ptr; i < ptr + l; i++) {
cout << *i << " ";
for (int *j = i+1; j < ptr + l; j++) {
cout << *i - *j << " ";
}
}
现在你有了所有的金额。您可以执行所有必需的操作。对于您的示例,第二小:您可以在该双循环中添加以下代码
if (secondsmallest >= x) {
if (smallest >= x) {
secondsmallest = smallest;
smallest = x;
}else{
secondsmallest = x;
}
}
找到正确的位置添加它并x
用合适的符号替换:)
干杯......如果你觉得这个答案有帮助 - 考虑投票:)
推荐阅读
- c# - 如果内容是 XML 格式,我如何在 .NET Core 2.2 中进行 POST?
- python - 将(?)较小的 DataFrame 合并到更大的 DataFrame 中(Pandas/Python)
- json - 如何遍历 Angular 6 中下拉功能的多嵌套 JSON 对象?
- openrefine - 检查值中的不同单词
- c# - 对象没有服务时间的定义
- symfony - 在同一个树枝文件中有两种不同形式的问题
- postgresql - UPSERT - INSERT ... ON CONFLICT 失败,基于函数的索引作为 'lower()' 唯一约束
- sql - 如何根据非重复列中的逻辑消除某些列中的重复项
- python - 使用 Pandas 读取带有变量类型列的 Excel
- reactjs - 我应该提到 react-native 作为我的 react-native 库的依赖项吗?