全部评论 3

  • 方法二为什么会这样:cout << sz[a-k+1];

    3天前 来自 上海

    1
  • 方法三(归并)可以优化:
    #include <bits/stdc++.h>
    using namespace std;

    const int N = 1e6 + 10;
    int a[N];
    int n, k;

    // 返回基准值最终所在的下标
    int partition(int l, int r) {
    // 随机化基准值,防止最坏情况 O(N^2)
    int rand_idx = l + rand() % (r - l + 1);
    swap(a[l], a[rand_idx]);

    int x = a[l], i = l, j = r;
    while (i < j) {
        while (i < j && a[j] >= x) j--; // 注意:找第K大,大的放左边还是右边取决于你的逻辑
        // 这里我们维持原代码逻辑:小的在左,大的在右?
        // 原代码逻辑:a[j]>=x 跳过,说明想把小的换到左边。
        // 让我们统一标准:升序排列。
        while (i < j && a[i] <= x) i++;
        if (i < j) swap(a[i], a[j]);
    }
    a[l] = a[i]; // 此时 i==j
    a[i] = x;
    return i;
    

    }

    // 快速选择:在 a[l..r] 中寻找升序排列后下标为 target 的元素
    void quick_select(int l, int r, int target) {
    if (l >= r) return;

    int pos = partition(l, r);
    
    if (pos == target) {
        return; // 找到了,a[target] 就是答案
    } else if (target < pos) {
        quick_select(l, pos - 1, target); // 只在左边找
    } else {
        quick_select(pos + 1, r, target); // 只在右边找
    }
    

    }

    int main() {
    srand(time(0)); // 初始化随机种子
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> a[i];

    // 第 k 大数,在升序数组中的下标是 n - k
    // 例如 n=5, k=1 (最大), 下标 4. n-k = 4.
    int target_index = n - k;
    
    quick_select(0, n - 1, target_index);
    
    cout << a[target_index] << endl;
    return 0;
    

    }
    时间复杂度:O(n)

    2026-07-30 来自 江西

    0
    • 千年老唐贴了,而且你这 AI 有啥意义

      2026-07-30 来自 浙江

      0
  • dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

    2026-01-23 来自 浙江

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页