zoukankan      html  css  js  c++  java
  • 剑指offer面试题30:最小的k个数

    一、题目描述

      输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

    二、解题思路

      1、思路1

      首先对数组进行排序,然后取出前k个数。排序方法可选用快速排序,时间复杂度为O(nl*ogn)。示例代码:

    import java.util.ArrayList;
    import java.util.Arrays;
    public class Solution {     public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {         ArrayList<Integer> list=new ArrayList<>();         if(input.length<k||k==0)             return list;         Arrays.sort(input);            for(int i=0;i<k;i++)             list.add(input[i]);         return list;     } }

      2、思路2

      首先将这堆数据中前k个数装入list,并找到这个k个数的最大数max(k),然后从第k+1个数开始向后找,如果有小于这个max(k)的,则替换掉这个数,然后重新这k个数中找出最大的max(k)。这样一直向后扫描。时间复杂度为O(k*n)。示例代码:

    public class Solution_getLeastNumbers
    {
        public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k)
        {
            ArrayList<Integer> list = new ArrayList<Integer>();
    
            if (input.length < k || k == 0)
                return list;
    
            for (int i = 0; i < k; i++)
                list.add(input[i]);
    
            for (int i = k; i < input.length; i++)
            {
                int j = this.getMax(list);
                int temp = (Integer) list.get(j);
                if (input[i] < temp)
                    list.set(j, input[i]);
            }
            return list;
        }
        public int getMax(ArrayList<Integer> list)
        {
            int max = list.get(0);
            int j = 0;
            for (int i = 0; i < list.size(); i++)
            {
                if (list.get(i) > max)
                {
                    max = list.get(i);
                    j = i;
                }
            }
            return j;
        }
    }

      3、思路3

      扫描数组,每遍找出最小的那个数,复杂度为O(k*n)。示例代码:

    public ArrayList<Integer> GetLeastNumbers_Solution3(int[] input, int k)
        {
            ArrayList<Integer> list = new ArrayList<Integer>();
    
            if (input.length < k || k == 0)
                return list;
    
            for (int i = 0; i < input.length; i++)
                list.add(input[i]);
            
            ArrayList<Integer> result=new ArrayList<>();
            int num=0;
            while(num<k)
            {
                int minNum=list.get(0);
                for(int i=0;i<list.size();i++)
                {
                    if(list.get(i)<minNum)
                    {
                        minNum=list.get(i);
                    }
                }
                list.remove((Object)minNum);
                result.add(minNum);
                num++;
            }
            return result;
        }

      4、思路4

      先用数据中的前k个数建一个最大堆,建堆复杂度为O(k),然后从第k+1个数开始向后扫描,遇到小于堆顶元素时就替换掉堆定元素,更新堆,这个操作的复杂度为O(logk),总的时间复杂度为O(k+(n-k)*logk)=>O(n*logk)。示例代码:

      http://blog.csdn.net/zhiruchen/article/details/39120227

  • 相关阅读:
    常用的python模块
    程序人生--世界观
    JQuery与CSS之图片上放置button
    所谓的成就感,想想我们測过的那些功能
    王立平-bmp.compress()
    Android多媒体学习六:利用Service实现背景音乐的播放
    NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
    freeradius 启动报错Refusing to start with libssl version OpenSSL 1.0.1
    超级简单JS网页倒计时代码
    一起talk C栗子吧(第一百一十二回:C语言实例--线程同步概述)
  • 原文地址:https://www.cnblogs.com/xujian2014/p/5641655.html
Copyright © 2011-2022 走看看