「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。
题目描述
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
思路分析
这种题最简单的方式自然是直接sort,但是这并不是我们做这道题的意义。
如果只看数组中的第1个最大元素,我们需要一个整数型变量存储最大值,如果看数组中的第2个,那我们需要两个变量。然而我们未必真的需要k个元素作为缓存。
或许可以用一个数组进行存储,或者说是顺序表。然而数组在添加,删除这类操作上表现并不好。栈,队列与树同理。
因此我们可以使用最小堆来实现。
然而直接用只是说明我们对数据结构有所了解,单从学习角度考虑,不妨自己实现一版。
时间限制,暂时先只实现一版快排的。
具体实现
int quickSort(int left, int right, vector<int>& arr, int top){
//
int p = arr[left];
int left_tmp = left, right_tmp = right;
while(left < right){
while(left < right && arr[right] <= p){
right--;
}
arr[left] = arr[right];
while(left < right && p <= arr[left])left++;
arr[right] = arr[left];
}
// cout << "1" << endl;
arr[left] = p;
if (left == top - 1){
return p;
}
if (left > top - 1)return quickSort(left_tmp, left - 1, arr, top);
return quickSort(left + 1, right_tmp, arr, top);
}
int findKthLargest(vector<int>& nums, int k) {
return quickSort(0, nums.size() - 1, nums, k);
}
总结
需要注意的地方是,在完成一次排序后,其实只是确定了一个点的位置,因此可以用这个点与k-1做比较,如果恰好是k-1,则可以直接返回,否则根据两者大小关系决定遍历哪部分。同时由于已经确定left点不是答案,所以需要排除这个点,否则可能会出现死循环的现象。