最近leetcode的c++版本好像有点。。问题?就是,求解之后,特别吃内存。哪怕是他给的程序,复制粘贴提交,还是会非常吃内存。

用c++写几道题就发现,
go语言写:哇塞,程序挺不错的嘛!
c++写:哇靠,垃圾程序的典范!

e.g.: problem 17 phone number,典型的DFS题目。

一开始很快就能想到简单的递归方法:

string mapping[8]{"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
class Solution {
   public:
    Solution() {}
    ~Solution() {}
    vector<string> letterCombinations(string digits) {
        if (digits.length()<=0) return vector<string>{};
        vector<string> m;
        for (char& i : digits) {
            m.push_back(getString(i - '0'));
        }
        solve(m, "", 0, digits.length());
        return this->s;
    }
    void solve(vector<string> &m, string candidate, int ptr, int len) {
        if (ptr == len - 1) {
            for (char& i : m[ptr]) {
                s.push_back(candidate + i);
            }
        } else {
            for (char& i : m[ptr]) {
                solve(m, candidate+i, ptr+1, len);
            }
        }
    }
   private:
    vector<string> s;
    inline string getString(const int a) { return mapping[a - 2]; };

};

结果,4ms,4.7MB 内存。哇靠,垃圾程序的典范!

然后,改成了迭代:

class Solution {
   public:
    Solution() {}
    ~Solution() {}
    vector<string> letterCombinations(string digits) {
        unordered_map<char, string> mapping{
            {'2', "abc"}, {'3', "def"},  {'4', "ghi"}, {'5', "jkl"},
            {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};

        if (digits.empty()) return {};
        vector<int> steps{1};
        int sum = 1;
        for (auto& i : digits) {
            sum *= mapping[i].length();
            steps.push_back(sum);
        }
        vector<string> m(sum);
        for (size_t i = 0; i < digits.length(); i++) {
            string& s = mapping[digits[i]];
            int j = 0;
            while (j < sum) {
                for (int k = j; k < j + sum / steps[i + 1]; k++) {
                    m[k] += s[(k / (sum / steps[i + 1])) % s.length()];
                }
                j += sum / steps[i + 1];
            }
        }

        return m;
    }
};

时间内存还是没变化。没道理吧。。。
然后我把给的0ms的example复制粘贴提交,发现,不可能达到0ms~2ms之间。不管怎么优化,内存都是4MB以上。

于是乎得出了个结论:leetcode上的c++提交时间判断可能是对的,但内存肯定是错的hhh
折腾了一晚上,无果。

服务器性能有波动吧,再一个是在不断改版、加功能、甚至是升级编译器版本后,可能性能也会降低一些。

现在 POJ / HDOJ 上很多神题的历史记录都无法超越,前几年能跑 0ms 的解法,现在就只能 16ms 甚至 32ms 都有可能。

总之内存和时间是不可能同时测准的(来自 hustoj 的测不准定理,逃

    © 2018-2025 0xFFFF