LC1051.高度检查器
原题链接:https://leetcode.cn/problems/height-checker/
思路:计数排序
- 相当于计算当前数组和排序之后的数组当中有多少项是不一致的
- #card=math&code=O%28n%5Clg%20n%29&id=Iaw5E)复杂度的实现是不难的,直接排序即可
- 利用计数排序的思路可以实现稳定#card=math&code=O%28n%29&id=E5Aur)时间复杂度的排序
对于排序之后的结果并不关心,只关心当前位置的值是不是应该出现的最小值,如果是,那么就不变化,否则就变化
代码
class Solution {
public:
int heightChecker(vector<int>& heights) {
// 记录min_num是防止出现负数
int min_num = *min_element(heights.begin(), heights.end());
int max_num = *max_element(heights.begin(), heights.end()) - min_num;
int n = heights.size();
vector<int> cnt(max_num + 5, 0);
for (int i = 0; i < n; i++) {
heights[i] -= min_num;
cnt[heights[i]] += 1;
}
int index = 0, ans = 0;
// 对于每一个数i而言,如果它在heights中出现过
// 那么就要用heights[index]和其对比,判断是否需要调整
for (int i = 0; i <= max_num; i++) {
for (int k = 0; k < cnt[i]; k++) {
if (heights[index] != i) {
ans += 1;
}
index += 1;
}
}
return ans;
}
};