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门户中运行这段代码,而不是在任何系统上运行。
您使用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;
}