如何从std :: map中找到两个数字,其总和等于目标数?

时间:2015-09-29 06:18:51

标签: c++ dictionary

假设我有以下地图:

map<long,int>var;

它包含以下值:

var.insert( pair<long, int>(1, 1));
var.insert( pair<long, int>(3, 1));
var.insert( pair<long, int>(5, 1));
var.insert( pair<long, int>(7, 1));
var.insert( pair<long, int>(11, 1));
var.insert( pair<long, int>(20, 1));

现在如果我传递目标值= 10而不是我想要从我的地图中打印3,7,如果目标值= 12,那么我想从我的地图中打印5,7。我已经尝试但无法工作 任何人都可以帮助我,我如何从输入映射中选择两个数字,其总和等于目标数字。

- 谢谢。

2 个答案:

答案 0 :(得分:0)

查找目标总和项的简单算法:

  • 开始使用NSExceptionAllowsInsecureHTTPLoads 迭代所有元素。
  • 使用键i
  • 查找元素
  • 如果存在,则打印key = target - i->firsti->first并返回。
  • 否则增加key。如果i则没有答案。

您无法解释如何使用地图的值。看起来您实际上想要使用i == end代替。

答案 1 :(得分:0)

线性算法:

从两边开始,根据总和,移动正确的迭代器:

std::vector<std::pair<int, int>> find_sums(const std::set<int>&s, int total)
{
    if (s.empty()) {
        return {};
    }
    auto b = s.begin();
    auto e = s.end();
    --e;

    std::vector<std::pair<int, int>> res;
    do {
        auto sum = *b + *e;
        if (sum == total) {
            res.push_back({*b, *e});
            ++b;
        } else if (sum < total) {
            ++b;
        } else { // sum > total
            if (e == s.begin()) {
                break;
            }
            --e;
        }

    } while (b != e);

    return res;
}

Demo