方法一 堆排序 时间复杂度o(nlogk) 不推荐
方法二
基于快速排序的方法,时间复杂度为o(n)
选一个枢轴点,用快排的方法将数组分为两部分,位于枢轴点左边的数都比它大,位于枢轴点右边的数都比它小,
1)如果枢轴点的索引刚好是k-1,则此时它对应的就是数组的第k大的数;
2)如果比k-1大,那么第k大的数位于它的左边部分;
3)如果比k-1小,那么第k大的数位于它的右边部分;
具体代码如下
public class FindkthInArray {
public static void main(String[] args) {
int[] array = {92, 5, 88, 13, 80,7};
System.out.println(findKthLargest(array,2));
}
public static int findKthLargest(int[] nums,int k){
return findK(nums,k,0,nums.length-1);
}
private static int findK(int[] nums, int k, int start, int end) {
int low = start;
int high = end;
int key = nums[low];
while (low=key){
high --;
}
nums[low] = nums[high];
while (lowk-1){
return findK(nums, k, start, low-1);
}else {
return findK(nums, k, low+1, end);
}
}
}
-------------------------
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
示例 1:
输入: [1,2,0]
输出: 3
示例 2:
输入: [3,4,-1,1]
输出: 2
示例 3:
输入: [7,8,9,11,12]
输出: 1
说明:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。
分析
由于线性时间和常数空间的要求,我们开不了数组,用不了哈希表,不能排序。
能用的就只有数组本身以及额外常数个变量。。。
我们考虑如果整数都出现,那么最后数组排列应该是[1,2,3,4,5,…,n],每个都是递增1。
于是乎,如果我们最后也排列成这种形式,那么只要不满足nums[i]-nums[i-1]不等于1,那么就找到了最小的未出现的整数,但是我们没法排序。
所以我们可以强行另数组下标和存的值产生联系-> 令数字i出现在下标为i-1的位置,如果会越界则不做处理。
比如[3,4,-1,1]->[-1,4,3,1]->[-1,1,3,4]->[1,-1,3,4];
public class FirstInteger {
public static void main(String[] args) {
int[] nums = {7,8,9,11,12};
System.out.println(firstMissingPositive(nums));
}
public static int firstMissingPositive(int[] nums) {
int len = nums.length;
for (int i = 0; i < len;) {
//确定nums[i]的值对应的下标不越界,同时排除num[i]本身位置正确或者nums[i]应该放入的位置nums[i]-1原本就是nums[i](如[1,1])
if(nums[i]>0 && nums[i]<=len&&(nums[i]!=nums[nums[i]-1])){
swap(nums,i,nums[i]-1);
//换位置之后需要继续判断换过来的值是否在对的位置上,因此不能i++;
}else {
i++;
}
}
for (int i = 0; i < len; i++) {
if(nums[i] != i+1){
return i+1;
}
}
return len+1;
}
private static void swap(int[] nums,int pos1,int pos2){
int tmp = nums[pos1];
nums[pos1] = nums[pos2];
nums[pos2] = tmp;
}
}
public void sortColors(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int[] tmp = new int[3];
for (int num : nums) {
tmp[num]++;
}
for (int i = 0; i < nums.length; i++) {
if (tmp[0]-- > 0) {
nums[i] = 0;
} else {
if (tmp[1]-- > 0) {
nums[i] = 1;
} else {
nums[i] = 2;
}
}
}
}