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月前
|
存储 C语言
【03】逆序数组
【03】逆序数组
|
6月前
|
人工智能
数组逆序
数组逆序
30 3
C#基础⑥.2——数组(冒泡排序、求最值、数组排序、forr反转)
一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。
|
6月前
|
算法 索引
算法题解-数组中的第K个最大元素
算法题解-数组中的第K个最大元素
|
6月前
leetcode-6132:使数组中所有元素都等于零
leetcode-6132:使数组中所有元素都等于零
40 0
|
6月前
|
算法
leetcode-215:数组中的第K个最大元素
leetcode-215:数组中的第K个最大元素
35 0
|
算法
使用遍历方法和分治法求两个数组的值
看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。 问题描述 给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。
77 0
剑指offer 57. 数组中数值和下标相等的元素
剑指offer 57. 数组中数值和下标相等的元素
105 0
剑指offer 57. 数组中数值和下标相等的元素
|
存储 算法 前端开发
三刷”数组中的第K个最大元素“,我终于学会了堆排序
三刷”数组中的第K个最大元素“,我终于学会了堆排序
69 0