215. 数组中的第K个最大元素(时间复杂度o(n))

简介: 215. 数组中的第K个最大元素(时间复杂度o(n))

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

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

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

以空间换时间,数组下标不能为负数,故下标整体后移10000个单位,结果再返回

class Solution:
    def findKthLargest(self, nums, k):
        bucket = [0] * 20005
        for n in nums:
            bucket[n + 10000] += 1
        sum_val = 0
        for i in range(20004, -1, -1):
            sum_val += bucket[i]
            if sum_val >= k:
                return i - 10000
        return 0
  1. 创建一个长度为 20005 的数组 bucket,用于记录每个元素出现的次数。数组的索引从 -10000 到 10004,对应了可能的元素取值范围。
  2. 遍历输入数组 nums,将每个元素的出现次数记录在 bucket 数组中。具体而言,对于元素 n,在 bucket[n + 10000] 的位置加一。
  3. bucket 数组的末尾开始向前遍历,累积每个索引处的元素出现次数(从大到小累积)。当累积次数达到或超过 k 时,返回当前索引值减去 10000,即找到了第 k 大的元素。
  4. 如果遍历完整个 bucket 数组后还没有找到第 k 大的元素,返回默认值 0。

总体来说,该算法使用桶排序的思想,通过统计每个元素的出现次数,从大到小遍历桶来找到第 k 大的元素。

C语言实现

#include <stdio.h>
int findKthLargest(int* nums, int size, int k) {
    int bucket[20005] = {0};
    // Count the occurrences of each element in the bucket array.
    for (int i = 0; i < size; i++) {
        bucket[nums[i] + 10000]++;
    }
    // Traverse the bucket array from the end to find the kth largest element.
    int sum = 0;
    for (int i = 20004; i >= 0; i--) {
        sum += bucket[i];
        if (sum >= k) {
            return i - 10000;
        }
    }
    return 0;
}
int main() {
    // Example usage:
    int nums[] = {3, 1, 4, 4, 2};
    int size = sizeof(nums) / sizeof(nums[0]);
    int k = 2;
    int result = findKthLargest(nums, size, k);
    printf("The %dth largest element is: %d\n", k, result);
    return 0;
}
相关文章
|
6天前
leetcode-6132:使数组中所有元素都等于零
leetcode-6132:使数组中所有元素都等于零
22 0
|
6天前
|
算法
leetcode-215:数组中的第K个最大元素
leetcode-215:数组中的第K个最大元素
21 0
|
10月前
|
C#
C#基础⑥.2——数组(冒泡排序、求最值、数组排序、forr反转)
一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。
使用二分查找在有序数组里面查找元素
返回所有跟所求值匹配的元素下标
|
6天前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
32 0
|
11月前
|
存储 算法 前端开发
三刷”数组中的第K个最大元素“,我终于学会了堆排序
三刷”数组中的第K个最大元素“,我终于学会了堆排序
49 0
|
11月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
47 1
|
11月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
59 0
|
存储 算法 搜索推荐
LeetCode:215. 数组中的第K个最大元素——快速排序
题目描述:给定整数数组nums和整数** k**,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
leetcode 215 数组中的第k个最大元素
leetcode 215 数组中的第k个最大元素
85 0
leetcode 215 数组中的第k个最大元素