【问题标题】:How to find an item in an array that sum of all values before that is a spcific value? (C++ and C#)如何在数组中找到之前所有值的总和是特定值的项目? (C++ 和 C#)
【发布时间】:2013-06-12 22:36:20
【问题描述】:

假设我有一个特定大小的整数数组(比如 1000)

我想在这个数组中找到一个项目的索引,给定在这个项目之前(或包括这个项目)的数组中所有项目的总和。

例如假设我有以下数组:

 int[] values={1,2,3,1,3,6,4,8,2,11}

输入值为 6,然后我需要返回索引 2(上例中为 3 的基于零的索引),当给定 10 时,我应该返回索引 4。

最快的方法是什么?在 C++ 和 C# 中?

【问题讨论】:

  • 5 是一个有效的输入值吗? (它不是数组中所有项目之前或包括项目的总和。)如果它是有效输入,它的答案是什么?
  • @jwpat7 5 是有效输入,结果为 2(与 6 相同),因为第 2 项之前的值之和小于 5,第 2 项之后的值之和大于 5。

标签: c# c++ algorithm


【解决方案1】:

如果你只需要做一次,那么朴素的方式也是最快的方式:遍历数组,并保持运行总数。达到目标总和后,返回当前索引。

如果您需要针对不同的总和运行多个查询,请创建一个数组并在其中设置总和,如下所示:

var sums = new int[values.Length];
sums[0] = values[0];
for (int i = 1 ; i < sums.Length ; i++) {
    sums[i] = sums[i-1] + values[i];
}

如果所有值都是正数,您可以对 sums 运行二进制搜索以获取 O(log(n)) 中的索引。

【讨论】:

    【解决方案2】:

    学习 BST,这将是解决您问题的最快算法:

    http://en.wikipedia.org/wiki/Binary_search_tree

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 2021-07-19
      • 2015-08-18
      • 2016-08-08
      • 2020-09-23
      • 2020-10-09
      • 2022-11-24
      • 2019-11-21
      相关资源
      最近更新 更多