查找第 K 小数

查找第K小数

http://www.nowcoder.com/questionTerminal/204dfa6fcbc8478f993d23f693189ffd

思路

找第 K 小数,第一反应是全体排序,快排、归并 blabla,时间复杂度 O(nlogn),或者直接用 set,去重也省了,但是这样做有点无聊

#include<iostream>
#include<set>

using namespace std;

int main(){
    int n, k;
    while(cin >> n){
        set<int> nums;
        int num;
        for(int i = 0; i < n; i ++){
            cin >> num; nums.insert(num);
        }
        cin >> k;
        for(auto it = nums.begin(); it != nums.end(); it ++){
            k --;
            if(k == 0){
                cout << *it << endl; break;
            }
        }
    }
    return 0;
}

如果不考虑去重的话,我们可以用快排的思路去取第 K 小的数,平均时间复杂度为 O(n),但是因为要去重,这里借助一下 unordered_set 去一下重

#include<iostream>
#include<vector>
#include<unordered_set>

using namespace std;

int partition(vector<int>& nums, int low, int high){
    int pivot = nums[low];
    while(low < high){
        while(low < high && nums[high] >= pivot) high --;
        nums[low] = nums[high];
        while(low < high && nums[low] <= pivot) low ++;
        nums[high] = nums[low];
    }
    nums[low] = pivot;
    return low;
}

int quickSelect(vector<int>& nums, int low, int high, int k){
    int p = partition(nums, low, high);
    if(p == k) return nums[p];
    else if(p > k) return quickSelect(nums, low, p - 1, k);
    else return quickSelect(nums, p + 1, high, k);
}
int main(){
    int n, k;
    while(cin >> n){
        unordered_set<int> temp;
        int num;
        for(int i = 0; i < n; i ++){
            cin >> num;
            temp.insert(num);
        }
        vector<int> nums(temp.begin(), temp.end());
        cin >> k;
        cout << quickSelect(nums, 0, nums.size() - 1, k - 1) << endl;
    }
    return 0;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论

相关推荐

牛客36400893...:我不是这个专业的,但是简历确实没有吸引我的亮点,而且废话太多没耐心看
0offer是寒冬太冷还...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务