c++ - 返回 2d vector 中索引 i、j 的所有组合,总和为所需值

标签 c++ algorithm dictionary vector stl

我有一个二维 vector v (所有值为正,二维矩阵为方阵)和给定值k .例如,

v={
   {2,1},
   {3,4}
  }

k = 3

我想查找并存储 i, j 的所有这些组合这样

arr[i] + arr[j] = k, or
arr[i] = k, or
arr[j] = k

例如v[0][0] + v[0][1] = 3 & v[1][0] = 3 .我想将这些对存储在这样的数组中 std::vector<std::vector<std::pair<int, int>>> .

Sample input:
v={
   {2,1},
   {3,4}
  }

k = 3

Sample output:
{{(0,0),(0,1)}, {(1,0)}}

我工作的各个部分;

#include<iostream>
#include<vector>
int main(){
    using namespace std;
    vector<vector<int>>v={{2,1},{3,4}};
    vector<pair<int,int>>k;
    int size=v.size();
    for(size_t i=0;i<size;i++){
        for(size_t j=0;j<size;j++){
            if(v[i][j]==3){
                k.push_back(make_pair(i,j));
            }     
        }
    }
}

编辑 link对于我以上述方式感知并尝试解决的实际问题。

最佳答案

编辑

我给出的第一个答案是考虑可以选择任意数量的元素来形成目标总和。但由于我们最多只能取 2 个,所以这里进行修改。

如果两个元素组成目标和,要点是当你输入一个元素x , 如果我们已经输入了 y = target - x过去的元素,对 x所有出现的 y .

下面是应该很容易理解的代码。

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

typedef pair<int, int> pii;
typedef pair<pii, pii> PIJ;

int main() {
    int N, target;
    cin >> N >> target;

    vector<vector<int>> matrix(N, vector<int>(N));
    unordered_map<int, vector<pii>> M;
    vector<PIJ> res;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j) {
            int x;
            cin >> x;

            matrix[i][j] = x;

            int y = target - x;
            for (const pii& p: M[y])
                res.emplace_back(p, make_pair(i, j));

            M[x].emplace_back(i, j);
        }
    }
}

考虑一维长度的问题 n第一的。最天真的算法是形成所有 2^n-1组合并检查每个元素是否总计为 target .

幸运的是,相同的搜索空间可以被遵循最优子结构属性的另一种算法耗尽。让count(i, t)代表第一个i的组合总数总计为 t 的元素.那么count(i, t) = count(i-1, t-arr[i]) + count(i-1, t) .基本条件为 t = 0。 .如果0可以出现在输入数组中,那么您将不得不考虑到这一点。会有重叠的子问题,需要动态规划。

保持运行数组chosen每次选择一个值时(调用 count(i-1, t-arr[i]) 时),将索引插入 chosen如果达到基本条件,请推送 chosen 的拷贝进入你的说法combinations大批。当控件返回到您调用 count(i-1, t-arr[i]) 的位置时, 将此值弹出 chosen .

您的二维问题可以转换为一维数组 pair<int, int>并且可以应用相同的算法。

关于c++ - 返回 2d vector 中索引 i、j 的所有组合,总和为所需值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68065864/

相关文章:

c++ - 如何有效地计算小于或等于给定数字的 2 的最高幂?

c++ - 将模板仿函数传递给模板 std::function

algorithm - LL(*) 解析器如何工作?

c++ - 使用 Floyd–Steinberg 抖动不起作用

dictionary - 如何在 Solr 的 POJO 中存储 map ?

c++ - 在 C++ 的原始字符串中转义 R"()"

php - Facemash算法

python - 使用字典制作 matplotlib 图?

dictionary - 有没有一种惯用的方法可以在 Clojure 的 map 中找到匹配的键和值?

c++ - 为什么结构可以存储自己的大小?