215. Kth Largest Element in an Array
题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/?tab=Description
题目大意:给定一个未排序的数组,找出数组中第k大的数。举个例子数组nums为[3,2,1,5,6,4],k=2,则返回5.
思路:(1) 对数组进行降序排序后返回数组的第k-1个元素
(2) 利用快速排序的思想,从数组nums中随机找出一个元素X,把数组分为两部分small和large。large中的元素大于等于X,small中元素小于X。这时有两种情况:
1. large中元素的个数小于k,则small中的第k-|large|个元素即为第k大数;
2. large中元素的个数大于等于k,则返回large中的第k大数。时间复杂度近似为O(n)
算法步骤:
(1) 1、对数组进行快速排序(升序);2、返回数组的倒数第k个元素
(2) 1、初始化数组左右边界,l=0,r=nums.size()-1,初始化分割数pivot=nums[l];2、划分数组,把大于等于pivot的数分到左侧,小于pivot的数分到右侧,并返回pivot的下标index;3、如果index==k-1,则pivot即为第K大的数,返回pivot,若index<k-1,说明第k大的数在右侧,更新l=index+1,否则第k大的值在左侧,更新r=index-1;4、根据新的数组边界,重新划分数组。
算法复杂度:
(1) 时间复杂度O(nlog(n)),空间复杂度O(1)
(2) 时间复杂度O(n),空间复杂度O(1)
(1)
1 #include <algorithm> 2 3 class Solution { 4 public: 5 int findKthLargest(vector<int>& nums, int k) { 6 std::sort(nums.begin(), nums.end()); 7 return nums[nums.size() - k]; 8 } 9 };
(2)
1 class Solution { 2 public: 3 int findKthLargest(vector<int>& nums, int k) { 4 int l = 0, r = nums.size() - 1; 5 --k; 6 int index = 0; 7 while (l <= r) { 8 index = partition(nums, l, r); 9 if (index > k) 10 r = index - 1; 11 else if (index < k) 12 l = index + 1; 13 else 14 return nums[index]; 15 } 16 } 17 int partition(vector<int>& nums, int l, int r) { 18 int pivot = nums[l]; 19 while (l < r) { 20 while (l < r && nums[r] < pivot) 21 --r; 22 nums[l] = nums[r]; 23 while (l < r && nums[l] >= pivot) 24 ++l; 25 nums[r] = nums[l]; 26 } 27 nums[l] = pivot; 28 return l; 29 } 30 };
评测系统上运行结果: