您的位置:首页 > 其它

中山大学算法课程题目详解(第三周)

2017-09-23 12:33 225 查看

问题描述:

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

For example,

Given 
[3,2,1,5,6,4]
 and k = 2, return 5.

Note: 

You may assume k is always valid, 1 ≤ k ≤ array's length.

解决问题:

采用上课讲述到的分治法来解决这个问题,随机选取一个数字,按小于等于该数字以及大于改数字分成两组,按照每一组的个数跟K进行比较然后进行相应的递归操作。
首先我在递归的时候,采用了很多个vector,但是提交的时候一直出现内存限制错误,具体代码如下:
int findKthLargest(vector<int>& nums, int k) {
vector<int> leftPart;
vector<int> rightPart;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] <= nums[0]) {
leftPart.push_back(nums[i]);
}
else {
rightPart.push_back(nums[i]);
}
}
if (k <= rightPart.size()) {
vector<int>().swap(leftPart);
return findKthLargest(rightPart, k);
}
else if (k == rightPart.size() - 1) {
return nums[0];
}
else {
int len = k - rightPart.size() - 1;
vector<int>().swap(rightPart);
return findKthLargest(leftPart, len);
}
}
我已经使用了网上的vector<int>().swap(leftPart);去清除vector占用的内存(这里要知道vector创建之后并且push,之后进行earse还会会占据很大内存),但是依旧没有解决内存限制的问题,最后改了一下方法,没有在递归过程中用到vector,而是采用下标的方法解决,具体代码如下:

int findKthLargest1(vector<int>& nums, int k)
{
return findKLargestElement(k, nums, 0, nums.size() - 1);
}

int findKLargestElement(int k, vector<int>& nums, int low, int high) {
int left = low;
int right = high;
int key = nums[left];
while (left < right) {
while (left < right && key > nums[right]) right--;
nums[left] = nums[right];
while (left < right && key <= nums[left]) left++;
nums[right] = nums[left];
}
nums[left] = key;
if (left < k - 1) {
return findKLargestElement(k, nums, left + 1, high);
}
else if (left == k - 1) {
return key;
}
else {
return findKLargestElement(k, nums, low, left - 1);
}
}
这次作业被vector的内存坑了好久,目前也没法解决,还在研究中,算也是长知识了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: