zoukankan      html  css  js  c++  java
  • 29最小的K个数

    题目描述

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

    如果基于数字的第k个数字来调整,使得比第k个数字小的数字都位于数组的左边,比k个数字大的所有数字都位于数组右边。这样 调整之后,位于数组中左边的k个数字就行最小的k个数字(这k个不一定有序)。
     
     1 import java.util.ArrayList;
     2 public class Solution {
     3     public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
     4         ArrayList<Integer> res = new ArrayList<Integer>();
     5            if(k>=input.length||k==0){
     6             if(k==input.length){
     7                 for(int m=0;m<k;m++)
     8                 res.add(input[m]);
     9             }
    10         return res;
    11         }
    12         
    13         
    14         int start =0;
    15         int end = input.length-1;
    16         
    17         int j = partion(input,start,end);
    18         while(j!=k-1){
    19             if(j<k-1){
    20                 start=j+1;
    21                 j = partion(input,start,end);
    22             }
    23             else{
    24                  end=j-1;
    25                 j = partion(input,start,end);
    26             }
    27         }
    28         
    29         for(int m=0;m<k;m++)
    30             res.add(input[m]);
    31         return res;
    32     }
    33     private int partion(int a[] ,int lo,int hi){
    34         int i = lo;
    35         int j = hi+1;
    36         int v = a[lo];
    37         while(true){
    38             while(a[++i]<v) if(i>=hi) break;
    39             while(a[--j]>v) if(j<=lo) break;
    40             if(i>=j) break;
    41             swap(a,i,j);
    42         }
    43         swap(a,j,lo);
    44         return j;
    45     }
    46     private void swap(int[] a,int i,int j){
    47         int temp = a[j];
    48         a[j] = a[i];
    49         a[i] = temp;
    50     }
    51     
    52 }

     20180310

     1 # -*- coding:utf-8 -*-
     2 class Solution:
     3 
     4     def GetLeastNumbers_Solution(self, a, k):
     5         # write code here
     6         def partation(a, lo, hi):
     7             if(lo > hi):
     8                 return
     9             key = a[lo]
    10             i = lo
    11             j = hi
    12             while(i < j):
    13                 while i < hi and a[i] <= key:
    14                     i += 1
    15                 while j > lo and a[j] >= key:
    16                     j -= 1
    17                 if(i<j):
    18                     swap(a, i, j)
    19             swap(a, lo, j)
    20             return j
    21         def swap(a,i,j):
    22             temp = a[i]
    23             a[i] = a[j]
    24             a[j] = temp
    25             
    26         if(k==len(a)):
    27             return sorted(a)
    28         if(k>len(a) or k ==0):
    29             return []
    30         lo = 0
    31         hi = len(a) - 1
    32         j = partation(a, lo, hi)
    33         while(j != a[k - 1]):
    34             if(j > k - 1):
    35                 hi = j - 1
    36                 j = partation(a, lo, hi)
    37             else:
    38                 lo = j + 1
    39                 j = partation(a, lo, hi)
    40         
    41         return sorted(a[:k])
  • 相关阅读:
    SOJ 1035 DNA matching
    SOJ 1027 MJ,Nowhere to Hide
    SOJ 1021 Couples
    SOJ 1020 Big Integer
    C#中正则表达式的简单使用
    根据HTTP header收集客户端相关信息 --- tornado demo
    IIS7配置Gzip压缩
    网站性能工具Yslow的使用方法
    配置ETags
    细说ETags以及如何在 IIS6和 IIS7下取消ETags
  • 原文地址:https://www.cnblogs.com/zle1992/p/8035546.html
Copyright © 2011-2022 走看看