compare函数最多被调用10000次,n2的排序无效。
假设我们已经前i个数已经排好了,我们现在要把第i+1个数插入排好的数组当中,其实就是在排好的i个数中找一个最大的小于它的数,然后插入这个数的后面,二分即可。
// Forward declaration of compare API.
// bool compare(int a, int b);
// return bool means whether a is less than b.
class Solution {
public:
vector<int> specialSort(int N) {
vector<int>res;
for(int i=1;i<=N;i++){
int l=0,r=res.size()-1;
while(l<r){
int mid=l+r+1>>1;
if(compare(res[mid],i))l=mid;
else r=mid-1;
}
if(res.size()&&compare(res[l],i))res.insert(res.begin()+l+1,i);
else res.insert(res.begin(),i);
}
return res;
}
};