[英]How to return 2 indexes of a vector?
我正在編寫此程序以在向量中查找 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 {};
}
如果我添加另一個循環來查找第二個數字的位置,則運行時間將為 O(n^2),我希望我的程序以 O(nlogn) 運行。 如何返回第二個數字的位置?
std::binary_search
僅返回一個bool
指示您要查找的元素是否存在。 沒有返回有關此元素位置的信息。
相反,適當的算法將是std::lower_bound
,它進行二分搜索,並返回您正在尋找的元素應該在哪里的位置(如果它存在)。 所以你可以像這樣實現它:
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};
}
此外,您的函數的返回類型是vector<int>
,它可以工作,但由於您始終只返回 2 個值,因此我建議改用std::pair<int, int>
。
您可以通過從目標數字到索引的差異中保存unordered_map
以 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 {};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.