目录:
- 1. quick select
- 2. kth-smallest-numbers-in-unsorted-array - 第k小的数 (401 in lintcode)
- 3. kth-largest-element 第k大的数( 5 in lincode)
- 4. median - 中位数 ( 80 in lincode)
1. quick select(604 in lintcode)
1.1 思路 & 代码
int quickSelect(vector<int> &nums, int start, int end, int k){
if(start == end){
return nums[start];
}
int i=start,j=end;
int pivot = nums[(start+end)/2];
while(i<=j){
while(i<=j && nums[i]<pivot){
i++;
}
while(i<=j && nums[j] > pivot){
j--;
}
if(i<=j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
if(start + k - 1 <= j){
return quickSelect(nums, start, j, k);
}
else if(start+k-1 >= i){
return quickSelect(nums, i, end, k - (i-start));
}
return nums[j+1];
}
2. kth-smallest-numbers-in-unsorted-array (461 in lintcode)
2.1 题目
http://www.lintcode.com/zh-cn/problem/kth-smallest-numbers-in-unsorted-array/
http://www.jiuzhang.com/solution/kth-smallest-numbers-in-unsorted-array/
找到一个无序数组中最小的K个数.
样例
[3, 4, 1, 2, 5], k = 3, 最小的三个数字为 [1, 2, 3]
2.2 思路 & 代码
与求最大的第k个数相比,只是改变了以下画横线的两处,即改为升序排列。
class Solution {
public:
/*
* @param k: An integer
* @param nums: An integer array
* @return: kth smallest element
*/
int kthSmallest(int k, vector<int> nums) {
// write your code here
if(nums.size()==0){
return -1;
}
return quickSelect(nums, 0,nums.size()-1, k);
}
int quickSelect(vector<int> &nums, int start, int end, int k){
if(start == end){
return nums[start];
}
int i=start,j=end;
int pivot = nums[(start+end)/2];
while(i<=j){
while(i<=j && nums[i]<pivot){
i++;
}
while(i<=j && nums[j] > pivot){
j--;
}
if(i<=j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
if(start + k - 1 <= j){
return quickSelect(nums, start, j, k);
}
else if(start+k-1 >= i){
return quickSelect(nums, i, end, k - (i-start));
}
return nums[j+1];
}
};
3. kth-largest-element 第k大的数 ( 5 in lincode)
3.1 题目
http://www.lintcode.com/zh-cn/problem/kth-largest-element/
http://www.jiuzhang.com/solution/kth-largest-element/
在数组中找到第k大的元素。
样例
给出数组 [9,3,2,4,8],第三大的元素是 4
给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推
3.2 思路
class Solution {
public:
/*
* @param n: An integer
* @param nums: An array
* @return: the Kth largest element
*/
int kthLargestElement(int n, vector<int> &nums) {
// write your code here
if(nums.size()==0){
return -1;
}
return quickSelect(nums, 0,nums.size()-1, n);
}
int quickSelect(vector<int> &nums, int start, int end, int k){
if(start == end){
return nums[start];
}
int i=start,j=end;
int pivot = nums[(start+end)/2];
while(i<=j){
while(i<=j && nums[i]>pivot){
i++;
}
while(i<=j && nums[j] < pivot){
j--;
}
if(i<=j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
if(start + k - 1 <= j){
return quickSelect(nums, start, j, k);
}
else if(start+k-1 >= i){
return quickSelect(nums, i, end, k - (i-start));
}
return nums[j+1];
}
};
4. median - 中位数 ( 80 in lincode)
4.1 题目
http://www.lintcode.com/zh-cn/problem/median/
http://www.jiuzhang.com/solution/median/
给定一个未排序的整数数组,找到其中位数。
中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。
样例
给出数组[4, 5, 1, 2, 3], 返回 3
给出数组[7, 9, 4, 5],返回 5
4.2 思路
class Solution {
public:
/*
* @param : A list of integers
* @return: An integer denotes the middle number of the array
*/
int median(vector<int> &nums) {
// write your code here
if(nums.size()==0){
return -1;
}
return quickSelect(nums, 0,nums.size()-1, (nums.size()+1)/2);
}
int quickSelect(vector<int> &nums, int start, int end, int k){
if(start == end){
return nums[start];
}
int i=start,j=end;
int pivot = nums[(start+end)/2];
while(i<=j){
while(i<=j && nums[i] < pivot){
i++;
}
while(i<=j && nums[j] > pivot){
j--;
}
if(i<=j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
j--;
}
}
if(start + k - 1 <= j){
return quickSelect(nums, start, j, k);
}
else if(start+k-1 >= i){
return quickSelect(nums, i, end, k - (i-start));
}
return nums[j+1];
}
};