簡體   English   中英

如何返回向量的 2 個索引?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM