Problem: 912. 排序数组
思路
👨🏫 三叶题解
💖 AC:计数排序
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
class Solution {
public int[] sortArray(int[] nums) {
int max = -50001, min = 50001;
for (int num: nums) {
max = Math.max(num, max);
min = Math.min(num, min);
}
int[] counter = new int[max - min + 1];
for (int num: nums) {
counter[num - min]++;
}
int idx = 0;
for (int num = min; num <= max; num++) {
int cnt = counter[num - min];
while (cnt-- > 0) {
nums[idx++] = num;
}
}
return nums;
}
}
💖 TLE:快速排序板子
⏰ 理想时间复杂度:
O
(
N
l
o
g
N
)
O(NlogN)
O(NlogN)
🌎 空间复杂度:
O
(
1
)
O(1)
O(1)
😶 被卡最坏的情况啦!
😶 原数组有序的情况下,选第一个数为标准值,所有数都会被分到另一边去
⏰
O
(
n
2
)
O(n^2)
O(n2)
class Solution {
public int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
public void quickSort(int[] a,int left,int right){
if(left < right){
int x = a[left];
int l = left;
int r = right;
while(l < r ){
while(l < r && a[r] >= x )//先找右边小于标准值的数放在左边的位置(标准值也是在左边)
r--;
a[l] = a[r];
while(l < r && a[l] <= x)// 再找左边大于标准值的数放在右边
l++;
a[r] = a[l];
}
a[l] = x;
quickSort(a,left,l);
quickSort(a,l+1,right);
}
}
}