• 面试题30:最小的k个数


    题目描述

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

    题目分析

    剑指Offer(纪念版)P167

    代码实现

     
    O(n)的算法,只有当我们可以修改输入的数组时可用
    void GetLeastNumbers_Solution1(int* input, int n, int* output, int k)
    {
        if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
            return;
    
        int start = 0;
        int end = n - 1;
        int index = Partition(input, n, start, end);
        while(index != k - 1)
        {
            if(index > k - 1)
            {
                end = index - 1;
                index = Partition(input, n, start, end);
            }
            else
            {
                start = index + 1;
                index = Partition(input, n, start, end);
            }
        }
    
        for(int i = 0; i < k; ++i)
            output[i] = input[i];
    }
    
    
    
    int Partition(int data[], int length, int start, int end)
    {
        if(data == NULL || length <= 0 || start < 0 || end >= length)
            throw new std::exception("Invalid Parameters");
    
        int index = RandomInRange(start, end);
        Swap(&data[index], &data[end]);
    
        int small = start - 1;
        for(index = start; index < end; ++ index)
        {
            if(data[index] < data[end])
            {
                ++ small;
                if(small != index)
                    Swap(&data[index], &data[small]);
            }
        }
    
        ++ small;
        Swap(&data[small], &data[end]);
    
        return small;
    }
    
    // Random Partition
    int RandomInRange(int min, int max)
    {
        int random = rand() % (max - min + 1) + min;
        return random;
    }
    
    void Swap(int* num1, int* num2)
    {
        int temp = *num1;
        *num1 = *num2;
        *num2 = temp;
    }
    
    O(nlogk)的算法,特别适合处理海量数据

    下面的代码也可以使用priority_queue来实现

    typedef multiset<int, greater<int> >            intSet;
    typedef multiset<int, greater<int> >::iterator  setIterator;
    
    void GetLeastNumbers_Solution2(const vector<int>& data, intSet& leastNumbers, int k)
    {
        leastNumbers.clear();
    
        if(k < 1 || data.size() < k)
            return;
    
        vector<int>::const_iterator iter = data.begin();
        for(; iter != data.end(); ++ iter)
        {
            if((leastNumbers.size()) < k)
                leastNumbers.insert(*iter);
    
            else
            {
                setIterator iterGreatest = leastNumbers.begin();
    
                if(*iter < *(leastNumbers.begin()))
                {
                    leastNumbers.erase(iterGreatest);
                    leastNumbers.insert(*iter);
                }
            }
        }
    }
    

      

  • 相关阅读:
    cshtml常用标签
    模板方法模式(Template Method)
    day10-python-协程异步IORabbitMQ队列 edis缓存
    Gitlab+Jenkins自动化部署
    day9-python-进程、线程和协程
    day8-python-socket编程
    day7-python-面向对象进程进阶
    day6-python-面向对象
    day5-python-常用模块
    zabbix监控rabbitmq
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4832499.html
Copyright © 2020-2023  润新知