【问题标题】:Multiple condition on a sort (c++)排序上的多个条件(c ++)
【发布时间】:2020-11-20 21:40:03
【问题描述】:

我正在尝试仅使用 c++ 排序功能来做到这一点LeetCode problem,但我似乎可以找到根据多个条件对元素进行排序的正确方法。

问题希望您返回没有任何通往另一个城市的路径的目的地城市。在我的排序中,我希望这个城市成为我向量的最后一个元素。现在,这是我拥有的代码:

class Solution {
public:
    string destCity(vector<vector<string>>& paths) {
        sort(paths.begin(), paths.end(),[](vector<string> a, vector<string> b ){return (a[1] == b[0]);});
        return (paths[paths.size() -1][1]);   
    }
};`

输入是路径向量([cityA -> cityB], [cityM -> city N] , ...)。

在下图中,我们可以看到输入、输出、我的标准输出以及函数的预期结果:

您可以接受,如果一条路径的输出城市等于另一条路径的输入城市 [cityA-> cityB], [cityB -> cityC], ...,则我的排序仅确保两条路径是连续的。但我的问题是,我的排序没有处理没有任何通往另一个城市的路径的城市(也就是目的地城市)的情况。我想把它放在这个特定的城市作为我向量的最后一个元素。我可以通过在我的排序函数中添加一些代码(条件)来做到这一点吗?如果是,如何?

谢谢。

【问题讨论】:

  • 那些无用的在线竞赛网站的问题在于,它们实际上并不能帮助任何人学习 C++。例如,他们没有解释比较器函数必须实现“严格的弱排序”,以及它的含义。该解释只能在in a good C++ textbook 找到。附言他们也没有解释将整个向量(按值)传递给比较器函数是多么低效,以及更好的方法。同样,请参阅一本好的教科书进行解释。
  • @sam 公平地说,按值传递是 OP 的错。他们使用通过引用传递。但是,是的,关于向量向量和在没有指导的情况下将新手扔给算法,我支持你。

标签: c++ string sorting vector conditional-statements


【解决方案1】:

std::sort 无法做到这一点。排序功能需要元素的总顺序。你只有一部分。将所有对放入后,排序可能会决定比较两个不相关的元素。它不会试图找到一种方法以“正确”的顺序比较它们。

你需要找到一个新的算法。我可以建议:

std::map<string, string> destinations;

然后只是跟随目的地直到你到达终点?

【讨论】:

    【解决方案2】:

    排序是 O(N Log N),即使你可能会找到排序的方法,但我们最好避免在这里排序,并将这个问题的时间复杂度降低到 O(N)。

    这将通过:

    #include <string>
    #include <unordered_set>
    
    struct Solution {
        static std::string destCity(
            const std::vector<std::vector<std::string>>& paths
        ) {
            std::unordered_set<std::string> starts_map;
    
            for (const auto& path : paths) {
                starts_map.insert(path[0]);
            }
    
            for (const auto& path : paths) {
                if (!starts_map.count(path[1])) {
                    return path[1];
                }
            }
    
            return "";
        }
    };
    

    参考文献

    • 有关其他详细信息,您可以查看Discussion Board。有很多公认的解决方案,有各种languages 和解释、高效的算法,以及渐近的time/space 复杂性分析1, 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多