Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:每次,函数都返回空向量。为什么?_C++_Algorithm_Dictionary_Data Structures_Stl - Fatal编程技术网

C++ C++;:每次,函数都返回空向量。为什么?

C++ C++;:每次,函数都返回空向量。为什么?,c++,algorithm,dictionary,data-structures,stl,C++,Algorithm,Dictionary,Data Structures,Stl,我一直在努力解决这个问题: 给定一个整数数组,返回两个数字的索引,如 它们加起来就是一个特定的目标 您可以假设每个输入都有一个解决方案, 同一元素不能使用两次 示例: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. 我一直在尝试使用map解决此问题,我尝试的解决方案如下: #include <iostream> #include <

我一直在努力解决这个问题:

给定一个整数数组,返回两个数字的索引,如 它们加起来就是一个特定的目标

您可以假设每个输入都有一个解决方案, 同一元素不能使用两次

示例:

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;
}
#包括
#包括
#包括
使用名称空间std;
向量twoSum(向量和nums,整数目标){
地图索引;
对于(int i=0;ifirst,i};
指数[i]=nums[i];
}
返回{};
}
int main(){
std::vector nums={2,7,11,15};
int目标=9;
标准::向量ans=twoSum(nums,目标);
用于(常量自动和元素:ans){

std::cout尝试执行:
索引[num[i]=1


您正在使用索引作为映射的键,但实际上应该使用值。

您已经非常接近解决问题,但您的代码有一个小而关键的问题

将元素作为添加到地图中(key=index,value=number)

…本质上,您只是以不同的格式重新创建了数组,因此如果您仔细想想,对于每个
i
nums[i]==index[i]
。这种方法实际上无法进一步解决您的问题

相反,您应该尝试映射(key=number,value=index)

这样,当您在地图上搜索以前遇到的号码时

auto it = indices.find(target - nums[i]);
…您最终搜索的是数字本身而不是索引

请注意,您还需要更改返回值以使用索引,而不是值,因为现在地图的格式不同了

auto it = indices.find(target - nums[i]);
if (it != indices.end())
    return {it->second, i};

根本不用地图

std::vector<int> twoSum(const std::vector<int> & nums, int target) {
    for (int it1 = nums.begin(); it1 != nums.end(); ++it1) {
        auto it2 = std::find(std::next(it1), nums.end(), target - *it1);

        if (it2 != nums.end())
            return {std::distance(nums.begin(), it1), std::distance(nums.begin(), it2)};
    }

    // You can assume this is never reached, throwing is noisier than returning empty
    throw std::runtime_error("invalid arguments to twoSum");
}
std::vector twoSum(const std::vector&nums,int target){
对于(int it1=nums.begin();it1!=nums.end();++it1){
auto it2=std::find(std::next(it1),nums.end(),target-*it1);
if(it2!=nums.end())
返回{std::distance(nums.begin(),it1),std::distance(nums.begin(),it2)};
}
//你可以假设这是永远达不到的,投掷比返回空的噪音更大
抛出std::runtime_错误(“twoSum的参数无效”);
}

您是否尝试过在调试器中单步执行程序?或添加更多cout语句以显示程序运行时的值?如果要编写任何非琐碎的程序,您需要了解这是一个基本的疑难解答过程。如果您可以确定某一行不执行您想要的操作,并且您不明白为什么,则f这里有足够的空气来提问。当您执行
索引.find(target-nums[i])
时,您假定键是数字,值是索引。但是当您执行
索引[i]=nums[i]
,你假设相反。找出你想走的方向,并保持一致。哦,是的,你绝对正确@Igor Tandetnik。非常感谢。我想我必须更好地理解
map.find()
。@Paul Sanders,但是我如何使用
保存/获取两个索引?你是说
索引[num[I]=I
auto it = indices.find(target - nums[i]);
if (it != indices.end())
    return {it->second, i};
std::vector<int> twoSum(const std::vector<int> & nums, int target) {
    for (int it1 = nums.begin(); it1 != nums.end(); ++it1) {
        auto it2 = std::find(std::next(it1), nums.end(), target - *it1);

        if (it2 != nums.end())
            return {std::distance(nums.begin(), it1), std::distance(nums.begin(), it2)};
    }

    // You can assume this is never reached, throwing is noisier than returning empty
    throw std::runtime_error("invalid arguments to twoSum");
}