C++ 如何返回向量的两个索引?

C++ 如何返回向量的两个索引?,c++,algorithm,C++,Algorithm,我写这个程序是为了在一个向量中找到2个数字(向量没有排序),这样它的和就等于目标和。这是我的节目: #include <vector> #include <algorithm> using namespace std; vector<size_t> find_numbers(const vector<int>& nums, int target) { sort(nums.begin(), nums.end()); // Sort

我写这个程序是为了在一个向量中找到2个数字(向量没有排序),这样它的和就等于目标和。这是我的节目:

#include <vector>
#include <algorithm>
using namespace std;

vector<size_t> find_numbers(const vector<int>& nums, int target) 
{
    sort(nums.begin(), nums.end()); // Sort the vector

    for (size_t i = 0; i < nums.size(); ++i)
        if (binary_search(nums.begin(), nums.end(), target - nums[i]))
            return {i, ?}; // How to return the second number's position?

    return {};
}
#包括
#包括
使用名称空间std;
向量查找数(常量向量和nums,整数目标)
{
排序(nums.begin(),nums.end());//对向量进行排序
对于(size_t i=0;i
如果我添加另一个循环来查找第二个数字的位置,运行时间将是O(n^2),我希望我的程序以O(nlogn)运行。如何返回第二个数字的位置?

只返回一个
bool
,指示您要查找的元素是否存在。没有返回有关此元素位置的信息

相反,适当的算法应该是执行二进制搜索,并返回您要查找的元素(如果存在)的位置。所以您可以这样实现它:

for (size_t i = 0; i < nums.size(); ++i)
{
   auto it = std::lower_bound(nums.begin(), nums.end(), target - nums[i]);
   if (it != nums.end() && *it == target - nums[i])
     return {i, std::distance(nums.begin(), it};
}
for(size_t i=0;i
此外,函数的返回类型是
vector
,这将起作用,但由于您总是只返回2个值,因此我建议改用
std::pair

只返回一个
bool
,指示您正在查找的元素是否存在。没有返回有关此元素位置的信息t

相反,适当的算法应该是进行二进制搜索,并返回您要查找的元素(如果存在)的位置。因此,您可以这样实现它:

for (size_t i = 0; i < nums.size(); ++i)
{
   auto it = std::lower_bound(nums.begin(), nums.end(), target - nums[i]);
   if (it != nums.end() && *it == target - nums[i])
     return {i, std::distance(nums.begin(), it};
}
for(size_t i=0;i

此外,函数的返回类型是
vector
,这将起作用,但由于您总是只返回2个值,因此我建议使用
std::pair

您可以在O(n)时间复杂度内完成此操作,方法是从目标数到索引的差值中保持
无序映射

vector<size_t> find_numbers(const vector<int>& nums, int target) 
{
    unordered_map<int, int> map;

    for (size_t i = 0; i < nums.size(); ++i) 
    {
        int needed = target - nums[i];
        if (map.contains(needed)) 
        {
            return {map[needed], i};
        }
        else
        {
            map[needed] = i;
        }
    }
    return {};
}
vector find_数(常量向量和nums,int目标)
{
无序地图;
对于(size_t i=0;i
您可以在O(n)时间复杂度内完成这一点,方法是保持从目标编号到索引的差值的
无序映射:

vector<size_t> find_numbers(const vector<int>& nums, int target) 
{
    unordered_map<int, int> map;

    for (size_t i = 0; i < nums.size(); ++i) 
    {
        int needed = target - nums[i];
        if (map.contains(needed)) 
        {
            return {map[needed], i};
        }
        else
        {
            map[needed] = i;
        }
    }
    return {};
}
vector find_数(常量向量和nums,int目标)
{
无序地图;
对于(size_t i=0;i
排序(nums.begin(),nums.end())
不起作用,因为
nums
const
。您的函数基本上需要能够更改
nums
,否则返回的索引范围毫无意义。您正在查找
下界
二进制搜索
只告诉您元素是否存在,而
下界
事实上,报告是在哪里。我建议你多学习处理一对值。你怎么能记住C++中的每个内置函数?@ abCD多年的经验。以及访问好的引用和搜索引擎。):<代码>排序(NUS.NEXOR),NUMs(Enter)()
不起作用,因为
nums
const
。您的函数基本上需要能够更改
nums
,否则返回的索引范围毫无意义。您正在查找
下界
二进制搜索
只告诉您元素是否存在,而
下界
“事实上,报告是这样的。我建议你更多地研究如何处理一对价值观。你们怎么能记住C++中的每一个内置函数?@ ABCD多年的经验。以及访问好的参考文献和搜索引擎。”:弗兰Cou.OISANDILUX ARG,多么尴尬-忘记了<代码>其他<代码>分支。我有罪。已编辑。@FrançoisAndrieux
unorderedúmap.contains
平均而言,具有恒定的时间复杂性(参见示例)@Mureinik Oops,认为它是
std::map
@FrançoisAndrieux代码之前的文本确实令人困惑。我编辑它是为了让它更清楚,我指的是一个无序的
@FrançoisAndrieux arg,多么尴尬-忘记了
else
分支。我有罪。已编辑。@FrançoisAndrieux
unorderedúmap.contains
平均而言,具有恒定的时间复杂性(参见示例)@Mureinik Oops,认为它是
std::map
@FrançoisAndrieux代码之前的文本确实令人困惑。我对它进行了编辑以使它更清晰,我指的是一张无序的地图。