因为左侧和右侧的元素数目不同。_求数组中第K大的元素

5fc66a2a88990cfa68aaa00b8146b682.png

问题描述

求无序数组int[] nums中第K大的元素。

例如

输入:nums[] = {9,5,8},k = 2

输出:8

输入:nums[] = {3,1,2,4,5,5,6},k = 4

输出:4

题目来源:力扣(LeetCode)
链接: https:// leetcode-cn.com/problem s/kth-largest-element-in-an-array

问题分析

利用快速排序的思想,每次将数据分成左右2组,以及一个基准数flag。左侧数据比flag大,右侧数据比flag小。此时,比较k和flag的下标, flag的下标记作flagSwap,如果k-1=flagSwap(为什么是k-1?因为第1大的数,对应的数组下标是0),若相等,则flag就是要找的数;若k-1<flagSwap,则在左侧那一组中继续寻找;若k-1>flagSwap,则在右侧那一组中继续寻找。

代码实现

class Solution {public int findKthLargest(int[] nums, int k) {return fastSort(nums, 0, nums.length - 1, k);
}private int fastSort(int[] nums, int start, int end, int k) { /*以flag为基准,利用快速排序的思想,将数据分成左右2组 左侧数据比flag大,右侧比flag小*/
System.out.println("start= " + start + ", end= " + end + ", k= " + k);int flag = nums[end];int i = start, j = end;for (; i < j; ) {while (i < j && nums[i] >= flag) {
i++;
}if (i < j) {
nums[j] = nums[i];
j--;
}while (i < j && nums[j] <= flag) {
j--;
}if (i < j) {
nums[i] = nums[j];
i++;
}
}
nums[j] = flag;/*这里要注意的是,flagSwap=j-start,因为start既可能 从0开始,也可能从大于0开始,用j减去start才等于flag在数组 中的相对位置 */int flagSwap = j - start;
StringBuilder sb = new StringBuilder();int m = 0;while (m < nums.length) {
sb.append(nums[m] + " ");
m++;
}
System.out.println("nums: " + sb.toString() + "---->flagSwap= " + flagSwap);if (flagSwap < k - 1) {return fastSort(nums, j + 1, end, k - flagSwap - 1);
} else if (flagSwap > k - 1) {return fastSort(nums, start, j - 1, k);
} else {return nums[j];
}
}
}

7899eca4e06d56216123597eb3b001a8.png
运行结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值