如何减少此代码中的内存使用量?

时间:2018-12-22 13:58:52

标签: c++

完整的问题在这里https://www.interviewbit.com/problems/random-attendance/。如果不允许我在这里提出这些问题,请告诉我。 我认为我的解决方案是正确的,对于所提供的示例,我得到了预期的结果,但是内存超出了错误。

bool compare (string a, string b){
    return lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
}

vector<int> Solution::solve(int A, vector<int> &B) {
    vector <string> x;
    for(int i=0; i<A; i++){
        x.push_back(to_string(i+1));
    }
    sort(x.begin(), x.end(), compare);
    vector <int> ans;
    for(int i=0; i<B.size(); i++){
        ans.push_back(stoi(x[B[i]-1]));
    }
    return ans;
}

1 个答案:

答案 0 :(得分:2)

我只是编写将B [i]转换为给定A的正确值的函数,可能使用从A派生的其他预处理数据来加快/简化计算。预处理的数据应为大约(log_10 A)整数,即最多10或20个整数。不一定不是A。

您提出的解决方案在A很大时会失败,但是对于任何A都可以编写以O(B)运行的代码(只要A是int或long long,实际速度可能应该是O(B log log A)代表任意大的A)。


作为提示,我将举一个例子。假设A = 392,908。

我们有一些B [0],我们想确定它的索引。

第一位数字是多少?是1还是2?可能是3或4?怎么知道。

实际上,恰好有111,111个索引从1开始,与2相同,而有11,111个索引从4开始(与5,6,7,8,9相同)。

虽然剩余金额(A-2 * 111,111 + 6 * 11,111)用于数字3。使用此信息,不难确定索引B [0]中的第一位。

可以通过类似的步骤确定休息。