标签:
【重要的事情写在前面】
先来说说swap的实现方式,这道题我本来自己写了个swap的算法,除了通常的
swap(type& a, type& b){
type t = a;
a = b;
b = a;
}
的写法外,还有一种【极客】写法:
swap(type& a, type& b){
a ^= b;
b ^= a;
a ^= b;
}
以上两种写法在swap(x, x)时不等价!
也就是第一种写法在swap同一个元素时能得到想要结果(元素跟自己交换就相当于没有交换),但第二种写法swap同一个元素时会把该元素置0!看看算法实现就明白了,用的时候要小心,或者干脆就用标准库函数,别炫技巧挖坑给自己跳!
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大的元素,一种方法是利用快排的partition策略,每次partition后比较枢轴位置是不是第k大元素的位置,不是的话也能减少一半搜索范围,代码如下:
class Solution { public: int findKthLargest(vector<int>& nums, int k) { int left = 0, right = nums.size() - 1; while(true){ int pivot = partition(nums, left, right); if(pivot == k - 1) return nums[pivot]; if(pivot < k - 1){ left = pivot + 1; }else{ right = pivot - 1; } } } int partition(vector<int>& nums, int left, int right){ int pivot = nums[right]; int j = left - 1; for(int i = left; i <= right; ++i){ if(nums[i] >= pivot){ //myswap(nums[++j], nums[i]); swap(nums[++j], nums[i]); } } return j; } //这里的swap用这种实现是错的! void myswap(int& a, int& b){ a ^= b; b ^= a; a ^= b; } };
Kth Largest Element in an Array
标签:
原文地址:http://www.cnblogs.com/poweryong/p/4575007.html