1. 剑指 Offer 40. 最小的k个数
在最大堆改变一个数时,调用一次调整堆就可将堆再次变为最大堆
把前k个数调整为最大堆,从第k个数与最大堆顶比较,堆顶大于arr[k]就交换,再把前k个数调整为最大堆
比较一遍过后前k个数即为最小的k个数
void adjustHeap1(vector<int>& arr,int k,int i) {
调整堆,把前k个数调整为最大堆
int father = i, child = 2 * i + 1;
while (child < k) {
if (child < k - 1 && arr[child] < arr[child + 1]) {
child++;
}
if (arr[father]<arr[child]) {
swap(arr[father], arr[child]);
father = child;
child = father * 2 + 1;
}
else {
break;
}
}
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
int n = arr.size();
vector<int> result;
先把前k个调整为最大堆(只调用一次无法整体最大堆)
for (int i = (k / 2 - 1); i >= 0; i--) {
adjustHeap1(arr,k,i);
}
for (int i = k; i < n; i++) {
if (arr[0]>arr[i]) {
swap(arr[0], arr[i]);
adjustHeap1(arr,k,0);
}
}
for (int i = 0; i < k;i++) {
result.push_back(arr[i]);
}
return result;
}
2. 题号1528. 重新排列字符串
字符不在正确位置时交换,直到在正确位置
把第一个字符交换到正确位置,并把对应的indices也交换,因为交换过来的数正确位置不一定在这,所以要while循环,再次把他交换到正确位置,直到交换到在这的字符
string restoreString(string s, vector<int>& indices) {
int n=s.size();
for(int i=0;i<n;i++){
while(indices[i]!=i){
swap(s[i],s[indices[i]]);
swap(indices[i],indices[indices[i]]);
}
}
return s;
}