LintCode 题解丨阿里巴巴面试题:第k大元素

简介: LintCode 题解丨阿里巴巴面试题:第k大元素

在数组中找到第 k 大的元素。(你可以交换数组中的元素的位置)

在线评测地址:
https://www.lintcode.com/problem/kth-largest-element/?utm_source=sc-tianchi-sz0826

样例 1:

输入:
n = 1, nums = [1,3,4,2]
输出:
4
样例 2:

输入:
n = 3, nums = [9,3,2,4,8]
输出:
4
【题解】

算法:快速选择算法

最容易想到的就是直接排序,返回第k大的值。时间复杂度是O(nlogn),这里提供O(n)的解法。

这题其实是快速排序算法的变体,在九章算法班中也有详细讲解。通过快速排序算法的partition步骤,可以将小于pivot的值划分到pivot左边,大于pivot的值划分到pivot右边,所以可以直接得到pivot的rank。从而缩小范围继续找第k大的值。

partition步骤:

令left = start,right = end,pivot = nums[left]。
当nums[left] < pivot时,left指针向右移动。
当nums[right] > pivot时,right指针向左移动。
交换两个位置的值,right指针左移,left指针右移。
直到两指针相遇,否则回到第2步。
每次partition后根据pivot的位置,寻找下一个搜索的范围。

复杂度分析

设数组长度为n

时间复杂度O(n)

对一个数组进行partition的时间复杂度为O(n)。
分治,选择一边继续进行partition。
所以总的复杂度为T(n) = T(n / 2) + O(n),总时间复杂度依然为O(n)。
空间复杂度O(1)

只需要快速选择游标的O(1)额外空间。
public class Solution {

/**
 * @param n: An integer
 * @param nums: An array
 * @return: the Kth largest element
 */
public int kthLargestElement(int k, int[] nums) {
    int n = nums.length;
    // 为了方便编写代码,这里将第 k 大转换成第 k 小问题。
    k = n - k;
    return partition(nums, 0, n - 1, k);
}
public int partition(int[] nums, int start, int end, int k) {
    int left = start, right = end;
    int pivot = nums[left];
    
    while (left <= right) {
        while (left <= right && nums[left] < pivot) {
            left++;
        }
        while (left <= right && nums[right] > pivot) {
            right--;
        }
        if (left <= right) {
            swap(nums, left, right);
            left++;
            right--;
        }
    }
    
    // 如果第 k 小在右侧,搜索右边的范围,否则搜索左侧。
    if (k <= right) {
        return partition(nums, start, right, k);
    }
    if (k >= left) {
        return partition(nums, left, end, k);
    }
    return nums[k];
}
public void swap(int[] nums, int x, int y) {
    int temp = nums[x];
    nums[x] = nums[y];
    nums[y] = temp;
}

}
更多题解参见九章算法官网:
https://www.jiuzhang.com/solution/kth-largest-element/?utm_source=sc-tianchi-sz0826

相关文章
|
6月前
|
算法
27. 移除元素 Leetcode经典面试题
27. 移除元素 Leetcode经典面试题
37 1
|
6月前
|
NoSQL Redis 数据库
面试02-Redis 中的过期元素是如何被处理的?
面试02-Redis 中的过期元素是如何被处理的?
70 0
|
3月前
|
Python
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
30 0
|
6月前
|
Python
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
2024年最新【Python】循环结构:while 循环(1),阿里巴巴面试常见问题及回答技巧
|
6月前
|
SQL 分布式计算 算法
2024年最新【Python】列表元素的 删除 操作(remove()、pop()、切片,2024年最新Python社招面试题
2024年最新【Python】列表元素的 删除 操作(remove()、pop()、切片,2024年最新Python社招面试题
2024年最新【Python】列表元素的 删除 操作(remove()、pop()、切片,2024年最新Python社招面试题
|
6月前
|
Dubbo 网络协议 NoSQL
阿里巴巴的Netty面试题到底有多难,这些知识你能掌握多少?
Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。
|
6月前
|
机器学习/深度学习 数据挖掘 开发工具
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
2024年最全0基础学python开发工具及学习平台推荐_python平台a,面试阿里巴巴客服
|
6月前
|
Python
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
2024年最新【Python】变量 的定义和使用,阿里巴巴蚂蚁金服面试流程
|
6月前
|
算法 网络安全 Python
sqlmap性能优化_sqlmap 优化 不接受请求体,阿里巴巴网络安全面试题答案
sqlmap性能优化_sqlmap 优化 不接受请求体,阿里巴巴网络安全面试题答案
|
5月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】