LintCode 80:中央値(QuickSelectクラシックのタイトル)

  1. 中央値

整数でソートされていない配列を指定して、それの中央値を見つけます。

それがソートされた後の中央値は、配列の中央の数字です。

偶数の配列である場合、ソート後のN / 2番目の数を返します。


例1:

入力:[4、5、1、2、3]
出力:3
説明:
[1,2,3,4,5]、ソート後、中間数が3である
実施例2:

入力:[7,9、4、5]
出力:5
説明:
ソートした後、[4,5,7,9]、第二(4/2)数が5である
チャレンジ
O(N)時間。

お知らせ
配列のサイズが10000を超えていません

解決方法1:quickSelect。O(N)の時間複雑。
注が開始quickSelect場合> =終了時刻が戻りNUMSあること[開始]代わりNUMS [K]。
コードは以下の通りであります:

class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return: An integer denotes the middle number of the array
     */
    int median(vector<int> &nums) {
        int n = nums.size();
        vector<int> orignums;
        //int index = (n & 0x1) ? n / 2 + 1 : n / 2;
        return quickSelect(nums, 0, n - 1, (n + 1) / 2);
        return 0;
    }
private:
    int quickSelect(vector<int> &nums, int start, int end, int k) {
        if (start >= end) return nums[start]; //nums[k];
        int left = start, right = end;
        int pivot = nums[left + (right - left) / 2];
        while (left <= right) {
            while (left <= right && nums[left] < pivot) left++;
            while (left <= right && nums[right] > pivot) right--;
            if (left <= right) {
                swap(nums[left], nums[right]);
                left++;
                right--;
            }
        }
        if (start + k - 1 <= right)
            return quickSelect(nums, start, right, k);
        if (start + k - 1 >= left)
            return quickSelect(nums, left, end, k - (left - start));
        return pivot;
    }
};

解決策2:maxheap
TBD

コード同期
https://github.com/luqian2017/Algorithm

おすすめ

転載: blog.csdn.net/roufoo/article/details/104100193