import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @param k int整型
* @return int整型
*/
public int findKthSmallest (int[] nums, int k) {
// 计数排序 元素范围是-10000 - 10000 转化成 0 - 20000
int [] temp = new int[20001];
// 将负数转化为正数索引存放
for (int i = 0; i < nums.length; i++) {
temp[nums[i]+10000]++;
}
for (int i = 0; i < temp.length; i++) {
// 如果这个位置上有数值,那么数值的次数代码,i出现了几次
if(temp[i]!=0){
// 临时记录出现次数
int number = temp[i];
// 循环其实目的就是找出第k小的数字,因为i=0开始从前遍历,找的就是最小的
while(number>0){
k--;
number--;
// 如果k==0表明找到了,返回i-10000即可,因为由于有负数,上面加了10000
if(k==0){
return i-10000;
}
}
}
}
return -1;
}
/**
方法二:快速排序
*/
public int findKthSmallest(int[] nums, int k) {
return quickSelect(nums, 0, nums.length - 1, k);
}
private int quickSelect(int[] nums, int left, int right, int k) {
if (left == right) {
return nums[left];
}
int pivotIndex = partition(nums, left, right);
if (k == pivotIndex + 1) {
return nums[pivotIndex];
} else if (k < pivotIndex + 1) {
return quickSelect(nums, left, pivotIndex - 1, k);
} else {
return quickSelect(nums, pivotIndex + 1, right, k);
}
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[left];
int i = left + 1; // 左侧指针
int j = right; // 右侧指针
while (i <= j) {
if (nums[i] <= pivot) {
i++;
} else if (nums[j] >= pivot) {
j--;
} else {
swap(nums, i, j);
i++;
j--;
}
}
swap(nums, left, j); // 将pivot放置到正确的位置
return j;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
本题知识点分析:
1.计数排序
2.快速排序
3.数学模拟
4.数组遍历
本题解题思路分析:
1.将负数转化为正数索引存放
2.如果这个位置上有数值,那么数值的次数代码,i出现了几次
3.循环其实目的就是找出第k小的数字,因为i=0开始从前遍历,找的就是最小的
4.如果k==0表明找到了,返回i-10000即可,因为由于有负数,上面加了10000
本题也可以用快速排序做,但要自己手写,因为要做剪枝优化,时间复杂度才可以到O(n)
本题使用编程语言: Java
如果你觉得本题对你有帮助的话,可以点个赞支持一下,感谢~

京公网安备 11010502036488号