题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
 
思路:
利用快速排序的partion 来解决

如果基于数字的第k个数字来调整,使得比第k个数字小的数字都位于数组的左边,比k个数字大的所有数字都位于数组右边。这样 调整之后,位于数组中左边的k个数字就行最小的k个数字(这k个不一定有序)。

 
 import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(k>=input.length||k==0){
if(k==input.length){
for(int m=0;m<k;m++)
res.add(input[m]);
}
return res;
} int start =0;
int end = input.length-1; int j = partion(input,start,end);
while(j!=k-1){
if(j<k-1){
start=j+1;
j = partion(input,start,end);
}
else{
end=j-1;
j = partion(input,start,end);
}
} for(int m=0;m<k;m++)
res.add(input[m]);
return res;
}
private int partion(int a[] ,int lo,int hi){
int i = lo;
int j = hi+1;
int v = a[lo];
while(true){
while(a[++i]<v) if(i>=hi) break;
while(a[--j]>v) if(j<=lo) break;
if(i>=j) break;
swap(a,i,j);
}
swap(a,j,lo);
return j;
}
private void swap(int[] a,int i,int j){
int temp = a[j];
a[j] = a[i];
a[i] = temp;
} }

20180310

 # -*- coding:utf-8 -*-
class Solution: def GetLeastNumbers_Solution(self, a, k):
# write code here
def partation(a, lo, hi):
if(lo > hi):
return
key = a[lo]
i = lo
j = hi
while(i < j):
while i < hi and a[i] <= key:
i += 1
while j > lo and a[j] >= key:
j -= 1
if(i<j):
swap(a, i, j)
swap(a, lo, j)
return j
def swap(a,i,j):
temp = a[i]
a[i] = a[j]
a[j] = temp if(k==len(a)):
return sorted(a)
if(k>len(a) or k ==0):
return []
lo = 0
hi = len(a) - 1
j = partation(a, lo, hi)
while(j != a[k - 1]):
if(j > k - 1):
hi = j - 1
j = partation(a, lo, hi)
else:
lo = j + 1
j = partation(a, lo, hi) return sorted(a[:k])

最新文章

  1. Form Submit表单提交
  2. SQL增删查改注意的事项
  3. python 学习5--matplotlib画图实践
  4. 图解javascript中this指向
  5. CSS3学习教程:Media Queries详解
  6. Teamwork——Week 4 Daily Scrum Meeting#1 2013.10.23
  7. 3. 使用绘图API自定义视图 --- 旋转的方块
  8. 【C++编程规范】编程需要避免的常见错误
  9. 突发小事件,USB接口问题
  10. (转)Android Studio Error:Failed to resolve: com.android.support:appcompat-v7:25.1.0解决方案
  11. 4.2、Libgdx各个模块概览
  12. [Linux] deepin15.8搭建LNMP环境
  13. TP4212 FM9836C
  14. BZOJ4699 树上的最短路(最短路径+dfs序+线段树+堆+并查集)
  15. 【题解】 bzoj1076: [SCOI2008]奖励关 (装压+期望dp)
  16. boke练习: category类的编辑修改,总是提示:该分类名称已经存在
  17. redis序列化异常------------org.springframework.data.redis.serializer.SerializationException
  18. hud 3123 GCC
  19. (转)C#中Invoke的用法 一
  20. 关于Unity中获得自己节点下的组件的简易方法

热门文章

  1. nginx 403 forbidden 二种原因
  2. 如何给RecyclerView加上滚动条--现在就教你
  3. 第二百二十五节,jQuery EasyUI,PropertyGird(属性表格)组件
  4. 说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用
  5. WinCC7.3 Win764位系统安装教程
  6. PHP手机号码归属地查询API接口
  7. (转)java 静态内部类
  8. 最近5年133个Java面试问题列表
  9. centos 6.5 安装图形界面【转】
  10. 软件设计模式(Design pattern)(待续)