【发布时间】:2020-07-26 22:21:39
【问题描述】:
我一直在尝试解决这个问题:
给定一个整数数组,返回两个数字的索引 它们加起来就是一个特定的目标。
您可以假设每个输入都有完全一个解决方案, 并且您不能两次使用相同的元素。
示例:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
我一直在尝试使用map 解决这个问题,我尝试的解决方案如下:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
vector<int> twoSum(vector<int>& nums, int target) {
std::map<int, int> indices;
for (int i = 0; i < nums.size(); ++i) {
auto it = indices.find(target - nums[i]);
if (it != indices.end())
return {it->first, i};
indices[i] = nums[i];
}
return {};
}
int main() {
std::vector<int> nums = {2, 7, 11, 15};
int target = 9;
std::vector<int> ans = twoSum(nums, target);
for(const auto &elem : ans) {
std::cout << elem << " ";
}
std::cout << "\n";
return 0;
}
为了避免两个 for 循环,我试图找到 target - num2,因为 num1 + num2 = target。
所以,逻辑是
- 从输入向量
nums创建地图 - 使用
map.find(target - num[i]) - 返回指向
target-nums[i]的迭代器的第一个值,即映射中value= target-nums[i]的key和i。
因此,对于上面的代码,函数应该返回{0, 1}
但是,每次我都会得到一个空向量。谁能告诉我是我的逻辑错误还是我错误地操纵了地图或矢量?
【问题讨论】:
-
您是否尝试过在调试器中单步执行您的程序?或者添加更多 cout 语句来显示运行时的值是什么?如果您想编写任何重要的程序,这是您需要学习的基本故障排除过程。如果您可以确定一条特定的线路没有按照您的意愿执行,并且您不明白为什么,那么可以在这里询问。
-
当您执行
indices.find(target - nums[i])时,您假设键是数字,值是索引。但是当您执行indices[i] = nums[i]时,您会假设相反。弄清楚你想走哪条路,并保持一致。 -
哦,是的,你是绝对正确的@Igor Tandetnik。太感谢了。我想我必须更好地理解
map.find()。 -
@Paul Sanders,但是如何使用
set保存/获取两个索引?
标签: c++ algorithm dictionary data-structures stl