【剑指offer系列】 最小的k个数___30

来源:互联网 发布:博弈大师模拟软件 编辑:程序博客网 时间:2024/05/24 23:12

  题目描述:
  输入n个整数,返回其中最小的k个数
  
  分析:
  1)可以用快速排序的partion算法,当partion返回的索引为k或k-1时,左边的k个数恰好是最小的k个数(会改变原数组)
  2)当输入的数据量非常大时,可用堆排序来解决。(适合海量数据)
  
  代码:  

    int partion(vector<int>& nums,int begin,int end){        int pivot=nums[begin];        int i=begin,j=end;        while(i<j){            while(i<j&&nums[j]>=pivot)  --j;            while(i<j&&nums[i]<=pivot)  ++i;            swap(nums[i],nums[j]);        }        swap(nums[begin],nums[j]);        return j;    }    int findKthSmallest(vector<int>& nums, int k) {        int l=0,r=nums.size()-1;        k=k-1;        while(l<=r){            int mid=partion(nums,l,r);            if(mid==k)    return nums[mid];            if(mid<k) l=mid+1;            else r=mid-1;        }    }

  非递归:

    int findKthSmallest(vector<int>& nums, int k) {        int l=0,r=nums.size()-1;        k=k-1;        while(l<=r){            int i=l,j=r;            int pivot=nums[l];            while(i<j){                while(i<j&&nums[j]>=pivot)  --j;                nums[i]=nums[j];                while(i<j&&nums[i]<=pivot)  ++i;                nums[j]=nums[i];            }            nums[i]=pivot;            if(i==k)    return nums[i];            if(i<k) l=i+1;            else r=i-1;        }    }
0 0
原创粉丝点击