Bootstrap

数组中的第K个最大元素习题分析

习题:

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

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

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

分析:

此题规定时间复杂度为O(n),所以小伙伴们最喜欢用的双层循环暴力求解不能使用了。

在此向大家推荐一个比较方便的方法——使用比较器。

什么是比较器呢? 比较器是一个函数或函数对象,它接受两个参数,并返回一个布尔值,用于指示这两个参数的顺序关系。在C++中,比较器常用于标准库函数,如排序和搜索算法。

本质就是使用标准库中的sort函数,提供一个自定义的比较器来定义排序的规则,可以是升序,也可降序。

举一个降序比较器的例子:

#include <iostream>
#include <vector>
#include <algorithm> // 包含sort函数
using namespace std;
// 自定义比较器函数,用于降序排序
bool compare(int a, int b) {
    return a > b; // 如果a大于b,则返回true,意味着a应该排在b前面
}

int main() {
    // 创建一个整数数组
    vector<int> numbers = {3, 2, 4, 1, 5, 6};

    // 使用sort函数和自定义比较器进行降序排序
    sort(numbers.begin(), numbers.end(), compare);

    // 输出排序后的数组
  
    for (int number : numbers) {
      cout << number << " ";
    }
//输出结果为6 5 4 3 2 1
    return 0;
}

代码分析:

    int findKthLargest(vector<int>& nums, int k) {

        // 使用 sort 函数进行降序排序

        sort(nums.begin(), nums.end(), greater<int>());//这里就是使用比较器进行降序排序

        // 返回第 k 个最大的元素

        return nums[k-1]

//这里小伙伴要注意是K-1而不是k,因为数组下标是从0开始的

代码如下:

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        // 使用 sort 函数进行降序排序
        sort(nums.begin(), nums.end(), greater<int>());
        // 返回第 k 个最大的元素
        return nums[k-1];
    }
};

总结:

对于新手小伙伴来说,还是不太建议这么做,新手期的小伙伴一定要将基础打牢!今天就分享到这,还是一样 I will keep fighting!

;