【直接排序】
class Solution {
public int heightChecker(int[] heights) {
int[] e = heights.clone();
Arrays.sort(e);
int ans = 0;
for(int i = 0, n = e.length; i < n; i++){
if(heights[i] != e[i]) ans++;
}
return ans;
}
}
【自己写快排】
class Solution {
// 快排. 3:54 8
int[] h;
public void quickSort(int left, int right){
if(left >= right) return;
int flag = h[left], l = left, r = right;
while(left < right){
while(right > left && h[right] > flag) right--;
h[left] = h[right];
while(left < right && h[left] <= flag) left++;
h[right] = h[left];
}
h[left] = flag;
quickSort(l, left - 1);
quickSort(left + 1, r);
}
public int heightChecker(int[] heights) {
h = heights.clone();
quickSort(0, h.length - 1);
int ans = 0;
for(int i = 0, n = h.length; i < n; i++) {
if(heights[i] != h[i]) ans++;
}
return ans;
}
}
【计数排序】因为这个题的范围只有100,所以可以把出现的数字个数记录下来,从小打到排序
class Solution {
// 计数排序 4:04
public int heightChecker(int[] heights) {
int[] cnt = new int[101];
for(var x: heights) cnt[x]++;
int j = 0, ans = 0, n = heights.length;
for(var i = 0; i < n;){
while(cnt[j] == 0) j++;
for(var k = 0; k < cnt[j]; k++){
// System.out.println(j + " " + heights[i]);
if(heights[i] != j) ans++;
i++;
}
j++;
}
return ans;
}
}