0
votes

C ++: à chaque fois, la fonction renvoie le vecteur vide. Pourquoi?

J'ai essayé de résoudre ce problème:

Compte tenu d'un éventail d'entiers, retournez indices forts> des deux chiffres tels que qu'ils ajoutent à une cible spécifique. P>

Vous pouvez supposer que chaque entrée aurait exacorme forte> em> une solution, et vous ne pouvez pas utiliser le même élément deux fois. P> blockQuote>

Exemple: strong> p> xxx pré>

J'ai essayé de résoudre ce problème en utilisant la carte code> et ma tentative de solution em> est ci-dessous: P>

#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;
}


4 commentaires

Avez-vous essayé de progresser dans votre programme dans un débogueur? Ou ajouter plus de déclarations de COUT pour montrer quelles sont les valeurs comme elle s'exécute? C'est le processus de dépannage de base que vous devez apprendre si vous souhaitez programmer tout ce qui est non trivial. Si vous pouvez identifier une ligne spécifique où elle ne fait pas ce que vous voulez, et que vous ne comprenez pas pourquoi, puis assez juste pour demander ici.


Lorsque vous faites indices.find (cible - nums [i]) , vous supposez que la touche est le numéro et la valeur est l'index. Mais lorsque vous faites indices [i] = nums [i] , vous supposez le contraire. Déterminez de quelle manière vous voulez aller et être cohérent.


Oh oui, tu es absolument juste @igor Tandetnik. Merci beaucoup. Je pense que je dois comprendre map.find () encore mieux.


@Paul Sanders, mais comment puis-je conserver / obtenir deux indices à l'aide d'un ensemble ?


3 Réponses :


0
votes

Essayez de faire: indices [num [i]] = 1 .

Vous utilisez l'index comme clé de la carte, mais vous devez vraiment utiliser les valeurs.


1 commentaires

Avez-vous voulu dire indices [num [i]] = i ?



1
votes

Vous êtes très proche de résoudre le problème, mais votre code a un problème de petite mais critique.

Vous ajoutez des éléments à votre carte sous (clé = index, valeur = numéro) strong> p >

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


0 commentaires

0
votes

N'utilisez pas de carte du tout.

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");
}


0 commentaires