voidheapSort(vector<int>& arr){
int n = arr.size();
// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 逐个交换堆顶到末尾for (int i = n - 1; i > 0; i--) {
swap(arr[0], arr[i]);
heapify(arr, i, 0);
}
}
voidheapify(vector<int>& arr, int n, int i){
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) largest = left;
if (right < n && arr[right] > arr[largest]) largest = right;
if (largest != i) {
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
二、字符串处理算法
1. 有效的字母异位词
判断两个字符串是否包含相同字符且频次一致。思路是统计字符频次差值,若全为零则为异位词。
classSolution {
public:
boolisAnagram(string s, string t){
if (s.length() != t.length()) returnfalse;
vector<int> char_counts(26, 0);
for (int i = 0; i < s.length(); ++i) {
char_counts[s[i] - 'a']++;
char_counts[t[i] - 'a']--;
}
for (auto count : char_counts) {
if (count != 0) returnfalse;
}
returntrue;
}
};
classSolution {
public:
boolisPalindrome(string s){
int begin = 0, end = s.size() - 1;
while (begin < end) {
while (begin < end && !isalnum(s[begin])) begin++;
while (begin < end && !isalnum(s[end])) end--;
if (tolower(s[begin]) != tolower(s[end])) returnfalse;
begin++; end--;
}
returntrue;
}
};
解析:关键是跳过非有效字符后再比较。如果直接比较可能会因为标点符号导致误判。
三、堆相关选择题解析
题目 1
下列哪个序列是堆?
A. 94,31,53,23,16,72
B. 94,53,31,72,16,23
C. 16,53,23,94,31,72
D. 16,31,23,94,53,72