码迷,mamicode.com
首页 > 其他好文 > 详细

Kth Largest Element in an Array

时间:2015-06-14 15:06:14      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

【重要的事情写在前面】

先来说说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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!