- 中央値
整数でソートされていない配列を指定して、それの中央値を見つけます。
それがソートされた後の中央値は、配列の中央の数字です。
偶数の配列である場合、ソート後の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