数组中的第K个最大元素

数组中的第K个最大元素

​ 给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。

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

​ 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

复制代码
输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

复制代码
输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

题解:

​ 关于快排,我喜欢这个帖子https://blog.csdn.net/2302_78684687/article/details/138389058 很详细

​ 因为我写快排的习惯不是很传统,所有每次遇到一些细节的问题都会卡一下,当然这里也可以用对堆,但是建堆的时间复杂度虽然是 O(n),取顶元素的时间复杂度却不是,每次删除顶端元素维护堆的时间成本是 logn,取 k 次就是 nlogn

go 复制代码
func findKthLargest(nums []int, k int) int {
	var quick func(l, r int) int
	quick = func(l, r int) int {
		if l == r {
			return nums[l]
		}
		pivot := nums[l]
		i, j := l, r
		for i <= j {
			for nums[i] > pivot {
				i++
			}
			for nums[j] < pivot {
				j--
			}
			if i <= j {
				nums[i], nums[j] = nums[j], nums[i]
				i++
				j--
			}
		}
		if k-1 <= j {
			return quick(l, j)
		}
		if k-1 >= i {
			return quick(i, r)
		}
		return nums[k-1]
	}
	return quick(0, len(nums)-1)
}
java 复制代码
class Solution {
    public int findKthLargest(int[] nums, int k) {
        return quick(nums, k, 0, nums.length - 1);
    }
    // 这种写法,最后的 i , j 结局会交错,j 前, i 在后;
    private int quick(int[] nums, int k, int l, int r) {
        if (l >= r) {
            return nums[k - 1];
        }
        int pivot = nums[(l + r) / 2];
        int i = l;
        int j = r;
        while (i <= j) {
            while (nums[i] > pivot) {
                i++;
            }
            while (nums[j] < pivot) {
                j--;
            }
            if (i <= j) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
                j--;
            }
        }
        if (k - 1 <= j) {
            return quick(nums, k, l, j);
        }
        if (k - 1 >= i) {
            return quick(nums, k, i, r);
        }
        return nums[k - 1];
    }
}
java 复制代码
class Solution {
    public int findKthLargest(int[] nums, int k) {
        return quick(nums, k, 0, nums.length - 1);
    }
    // --- 这种写法最后 i 和 j 最终会指向一个元素
    private int quick(int[] nums, int k, int l, int r) {
        if (l >= r) {
            return nums[k - 1];
        }
        int pivot = nums[l];
        int i = l;
        int j = r;
        while (i < j) {
            while (i < j && nums[j] <= pivot) {
                j--;
            }
            nums[i] = nums[j];
            while (i < j && nums[i] >= pivot) {
                i++;
            }
            nums[j] = nums[i];
        }
        nums[i] = pivot;
        if (i > k - 1) {
            return quick(nums, k, l, i);
        }
        if (i < k - 1) {
            return quick(nums, k, i + 1, r);
        }
        return nums[i];
    }
}
相关推荐
iAkuya20 分钟前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼20 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck22 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆25 分钟前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
java干货36 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟43 分钟前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒1 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex51 小时前
几种 dump hash 方式对比分析
算法·哈希算法
堕2741 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
2302_813806222 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构