提问者:小点点

我是如何在这段代码中得到分段错误的?


vector<int> cutTheSticks(vector<int> arr) {
    vector<int> res;
    vector<int>::iterator it;
    int i=0, mini=0, c=arr.size();
    while(c>0) {
        res.push_back(c);
        mini=*min_element(arr.begin(),arr.end());
        for(i=0;i<arr.size();i++) {
            arr[i]-=mini;
        }
        for(auto it=arr.begin();it!=arr.end();it++) {
            i=*it;
            if(i==0)
                arr.erase(it);
        }
        c=arr.size();
    }
    return res;
}

我正在hackerank门户中运行这段代码,而不是在任何系统上运行。


共1个答案

匿名用户

您使用erase的方式导致了本例中的问题。 事实上,您完全不需要像这样复杂的方法来解决这个问题。

您可以简单地以相反的顺序对数组排序,然后使用pop_back(),而最后一个元素是0。 它还有助于降低复杂性,因为这样您就不需要每次都调用min_element。 您可以直接使用arr.back()作为最小元素。


方法背后的逻辑:

在每次迭代中,从每个元素中减去最小元素。 这使得具有最小值的数字为0。 显然,由于数组是以相反的顺序排序的,因此这些数字将位于数组的末尾。 然后,您希望删除这些元素,pop_back是这些元素的最佳可用选项之一。


下面是示例代码:

vector<int> cutTheSticks(vector<int> arr) {
    vector<int> res;
    sort(arr.begin(), arr.end(), greater<int>());
    while (not arr.empty()) {
        res.push_back(arr.size());
        for (auto &&i : arr)
            i -= arr.back();
        while (not (arr.back() or arr.empty()))
            arr.pop_back();
    }
    return res;
}