LeetCode:215. Kth Largest Element in an Array(输出第k大的数)

我不是女神ヾ 2022-04-08 11:55 304阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k

文章目录:

题目描述:

java实现方法1:利用队列的形式

python实现方式1:

java实现方式2:

python实现方式2:

源码github地址:


题目描述:

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

  1. 输入: [3,2,1,5,6,4] k = 2
  2. 输出: 5

示例 2:

  1. 输入: [3,2,3,1,2,4,5,5,6] k = 4
  2. 输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。


著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


java实现方法1:利用队列的形式

  1. /**
  2. * 找出第k小的值
  3. *
  4. * @param nums 数组
  5. * @param k 个数
  6. * @return 数字
  7. */
  8. private int kthLargestElement(int[] nums, int k) {
  9. Queue<Integer> queue = new PriorityQueue<>();
  10. for (int num : nums) {
  11. queue.add(num);
  12. }
  13. for (int i = 0; i < k - 1; i++) {
  14. queue.poll();
  15. }
  16. return queue.peek();
  17. }

时间复杂度:O(n.k)

空间复杂度:O(k)


python实现方式1:

  1. def kth_largest_element_num_1(self, nums: List[int], k: int) -> int:
  2. '''
  3. 找出第K个大的数
  4. Args:
  5. nums: 数组
  6. k: k个最大数
  7. Returns:
  8. 第k大那个数
  9. '''
  10. pq = PQ()
  11. for ele in nums:
  12. pq.put(ele)
  13. if pq.qsize() > k:
  14. pq.get()
  15. return pq.get()

时间复杂度:O(n.logn)

空间复杂度:O(k)


java实现方式2:

  1. /**
  2. * 找出第k大的值
  3. *
  4. * @param nums 数组
  5. * @param k 个数
  6. * @return 数字
  7. */
  8. private int kthLargestElement2(Integer[] nums, int k) {
  9. if (nums == null || nums.length < k) {
  10. return -1;
  11. }
  12. return quickSort(nums, 0, nums.length - 1, k);
  13. }
  14. /**
  15. * 快速排序选择元素
  16. *
  17. * @param nums 数组
  18. * @param l 位置l
  19. * @param r 位置r
  20. * @param k 第k大的数
  21. * @return 数字
  22. */
  23. private int quickSort(Integer[] nums, int l, int r, int k) {
  24. int index = randomPartition(nums, l, r);
  25. if (index == k - 1) {
  26. return nums[k - 1];
  27. } else if (index > k - 1) {
  28. return quickSort(nums, l, index - 1, k);
  29. } else {
  30. return quickSort(nums, index + 1, r, k);
  31. }
  32. }
  33. /**
  34. * 随机划分
  35. *
  36. * @param nums 数组
  37. * @param l 位置l
  38. * @param r 位置r
  39. * @return 选择位置
  40. */
  41. private int randomPartition(Integer[] nums, int l, int r) {
  42. int i = (int) Math.random() * (r - l) + l;
  43. swap(nums, i, r);
  44. return partition(nums, l, r);
  45. }
  46. /**
  47. * 划分数组,比阈值大的在左边,比阈值小的在右边
  48. *
  49. * @param nums 数组
  50. * @param l 位置l
  51. * @param r 位置r
  52. * @return 阈值位置
  53. */
  54. private int partition(Integer[] nums, int l, int r) {
  55. int pivot = nums[r];
  56. int rightMost = r;
  57. while (l <= r) {
  58. while (l <= r && nums[l] > pivot) {
  59. l++;
  60. }
  61. while (l <= r && nums[r] <= pivot) {
  62. r--;
  63. }
  64. if (l <= r) {
  65. swap(nums, l, r);
  66. }
  67. }
  68. swap(nums, l, rightMost);
  69. return l;
  70. }
  71. /**
  72. * 交换数组中两个元素的位置
  73. *
  74. * @param nums 数组
  75. * @param l 位置l
  76. * @param r 位置r
  77. */
  78. private void swap(Integer[] nums, int l, int r) {
  79. int temp = nums[l];
  80. nums[l] = nums[r];
  81. nums[r] = temp;
  82. }

时间复杂度:O(n.k)

空间复杂度:O(1)

python实现方式2:

  1. def kth_largest_element_num_2(self, nums: List[int], k: int) -> int:
  2. '''
  3. 找出第K个大的数
  4. Args:
  5. nums: 数组
  6. k: k个最大数
  7. Returns:
  8. 第k大那个数
  9. '''
  10. if nums == None or len(nums) < k:
  11. return None
  12. return self.quick_sort(nums, 0, len(nums) - 1, k)
  13. def quick_sort(self, nums: List[int], l: int, r: int, k: int) -> int:
  14. '''
  15. 快速排序
  16. Args:
  17. nums: 数组
  18. l: 位置l
  19. r: 位置r
  20. k: 第k大的数
  21. Returns:
  22. 数字
  23. '''
  24. index = self.random_partition(nums, l, r)
  25. if index == k - 1:
  26. return nums[k - 1]
  27. elif index > k - 1:
  28. return self.quick_sort(nums, l, index - 1, k)
  29. else:
  30. return self.quick_sort(nums, index + 1, r, k)
  31. def random_partition(self, nums: List[int], l: int, r: int) -> int:
  32. '''
  33. 随机生成数组
  34. Args:
  35. nums: 数组
  36. l:位置l
  37. r:位置r
  38. Returns:
  39. 位置
  40. '''
  41. i = random.randint(l, r)
  42. self.swap(nums, i, r)
  43. return self.partition(nums, l, r)
  44. def swap(self, nums: List[int], l: int, r: int) -> None:
  45. """
  46. 交换两个数的位置
  47. Args:
  48. nums: 数组
  49. l: 位置l
  50. r: 位置r
  51. Returns:
  52. None
  53. """
  54. temp = nums[l]
  55. nums[l] = nums[r]
  56. nums[r] = temp
  57. def partition(self, nums: List[int], l: int, r: int) -> int:
  58. '''
  59. 分组
  60. Args:
  61. nums: 数组
  62. l: 位置l
  63. r: 位置r
  64. Returns:
  65. 分组
  66. '''
  67. pivot = nums[r]
  68. right_most = r
  69. while l <= r:
  70. while l <= r and nums[l] > pivot:
  71. l += 1
  72. while l <= r and nums[r] <= pivot:
  73. r -= 1
  74. if l <= r:
  75. self.swap(nums, l, r)
  76. self.swap(nums, l, right_most)
  77. return l

时间复杂度:O(n.k)

空间复杂度:O(1)


源码github地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读