C++ 如何返回向量的两个索引?
我写这个程序是为了在一个向量中找到2个数字(向量没有排序),这样它的和就等于目标和。这是我的节目: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
#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çoisAndrieuxunorderedúmap.contains
平均而言,具有恒定的时间复杂性(参见示例)@Mureinik Oops,认为它是std::map
@FrançoisAndrieux代码之前的文本确实令人困惑。我编辑它是为了让它更清楚,我指的是一个无序的@FrançoisAndrieux arg,多么尴尬-忘记了else
分支。我有罪。已编辑。@FrançoisAndrieuxunorderedúmap.contains
平均而言,具有恒定的时间复杂性(参见示例)@Mureinik Oops,认为它是std::map
@FrançoisAndrieux代码之前的文本确实令人困惑。我对它进行了编辑以使它更清晰,我指的是一张无序的地图。