问题描述
现在有一个乱序的数组 int[] nums = new int{3,4,1,5,11,7,9};
给定数字int k, 如何寻找数组中第k小的数字的下标?
例如当k=1, 返回值res = 2; 当k=2,返回值res = 0;
解决方案:
两种解决方案:
1. 构造一个新的数据结构,重写排序方法
2. 基数排序
1. 构造一个新的数据结构。
因为我们需要的是元素的下标,此时我们可以构造一个带着下标的结构:
class Node{
int index;
int value;
Node(int index, int value){
this.index = index;
this.value = value;
}
}
然后利用这个数据结构来重写排序. (注意第k小的下标应该为k-1)
public int getIndexOfMinKNum(int[] nums, int k){
int n = nums.length;
Node[] nodes = new Node[n];
for(int i = 0; i<n; i++){
nodes[i] = new Node(i,nums[i]);
}
Arrays.sort(nodes,(o1,o2)->{
o1.value.compareTo(o2.value);
});
return nodes[k-1].index;
}
这种方式的时间复杂度为O(nlogn).
基本能够完成任务,但在一些特定条件下不是最佳方法。
2. 基数排序.
又称桶排,具体可以参考网络模板