C++ 有人能帮我找到一个数组中求和为k的元素对的索引吗?

C++ 有人能帮我找到一个数组中求和为k的元素对的索引吗?,c++,arrays,algorithm,C++,Arrays,Algorithm,注:这些是实际加起来等于k的元素的指数 但是,对于输入inta[]={1,1,1,1,1,1},这确实是正确的;int k=2给定的输出为: (1,3) (2,4) (0,5) (3,6) 然而,根据我的推测,输出必须有所有对,即(1,2)、(1,3)…(5,6)。 上述问题的正确程序是什么?输入1,1,1,1,1,1产生6+5+4+3+2+1=21=N*(N-1)/2=N²/2-N/2输出: (0,1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (1, 2) (1

注:这些是实际加起来等于k的元素的指数

但是,对于输入
inta[]={1,1,1,1,1,1},这确实是正确的;int k=2
给定的输出为:

(1,3)
(2,4)
(0,5)
(3,6)
然而,根据我的推测,输出必须有所有对,即(1,2)、(1,3)…(5,6)。
上述问题的正确程序是什么?

输入
1,1,1,1,1,1
产生6+5+4+3+2+1=21=N*(N-1)/2=N²/2-N/2输出:

(0,1) (0, 2) (0, 3) (0, 4) (0, 5) (0, 6) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (2, 3) (2, 4) (2, 5) (2, 6) (3, 4) (3, 5) (3, 6) (4, 5) (4, 6) (5、6)

您需要一个复杂度为O(N²)的算法来生成这样的输出。您的代码无法工作,因为复杂度为O(N)的代码无法产生如此多的输出

下面是一个使用无序映射的更高效的解决方案:

(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
(0,6)
#包括
#包括
#包括
#包括
int main(){
std::数组a{3,4,5,6,5,7,4};
std::无序地图nMap;
对于(std::size_t i=0;iif(左<右)std::听起来你可能需要学习如何使用调试器来逐步调试代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:对于每个元素,你可以找到一个元素您需要添加更多的代码来找到其他也可以完成求和的元素。
for(size_t i=0;i
-no
map
需要。@tedlynmo需要O(n^2)时间。使用map它在O(n)中 time@SomeshwarRoychowdhury我会比较真实时间而不是复杂度。对于这些小数组,完全搜索可能比地图查找快——但即使不是,它也会做正确的事情,而现在的地图查找却没有。定义算法可能输出的数量的原则是什么?@SomeshwarRoychowdhury一个基本的数学问题。一个集合有N*(N-1)2个元素子集。如果所有元素都适合所有其他元素,那么这是输出数的两倍。这叫做竞争性编程,但不是竞争性编程。这是带有基本编程的竞争性数学。
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
(0,6)
#include <array>
#include <vector>
#include <iostream>
#include <unordered_map>

int main() {
    std::array<int, 7> a{3,4,5,6,5,7,4};
    std::unordered_map<int, std::vector<std::size_t>> nMap;
    for (std::size_t i = 0; i < a.size(); ++i) {
        nMap[a[i]].push_back(i);
    }
    int k = 10;
    for (const auto &el : nMap) {
        if (nMap.find(k - el.first) == nMap.end()) continue;
        for (const auto &left : el.second) {
            for (const auto &right : nMap.at(k - el.first)) {
                if (left < right) std::cout << '(' << left << ',' << right << ")\n";
            }
        }
    }
    return 0;
}