zoukankan      html  css  js  c++  java
  • 2-剑指offer: 最小的K个数

    题目描述

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

    代码:

    // 这种topN问题比较常见的是使用堆来解决,最小的k个数就采用最大堆,最大的k个数就采用最小堆.
    // 此外任然可以用快排来解决.
    
    class Solution {
    public:
        int Partition(vector<int> &input, int left, int right) {
            if (left > right)
                return left;
            int key = input[left];
            int i = left;
            int j = right;
            while(i<j) {
                // 从右往左遍历
                while (i < j && input[j] >= key) {
                    j--;
                }
                
                // 交换
                if (i < j) {
                    input[i] = input[j];
                    i++;
                }
                
                // 从左往右遍历
                while(i<j && input[i] <= key) {
                    i++;
                }
                
                // 交换
                if (i<j) {
                    input[j] = input[i];
                    j--;
                }
            }
            input[i] = key;
            return i;
        }
    
        void QuickSort(vector<int> &input, int k, int left, int right) {
            if (left >= right) return;
            int mid = Partition(input, left, right);
            if (mid == k-1) return;
            else if(mid > k-1) QuickSort(input, k, left, mid-1);
            else if (mid < k-1) QuickSort(input, k, mid+1, right);
        } 
        
        vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
            vector<int> res;
            if ((size_t)k > input.size())
                return res;
            else{
                QuickSort(input, k, 0, input.size()-1);
                res.insert(res.end(), input.begin(), input.begin()+k);
            }
            return res;
        }
    };
    

    只是快排是能够解决这个问题的,不过这里对快排进行了一点更改,减小了时间复杂度.

  • 相关阅读:
    线性动力学变分原理基础 Part1
    对分析动力学的一些理解
    Matlab数值求解超越方程的根
    FORTRAN数值求超越方程的根
    vim 基础操作
    a simple vim set for fortran
    g95 ld: cannot find crt1.o: No such file or directory
    ug中英文对照
    autocad一些快捷键和命令
    列选主元的高斯消元法的Fortran程序
  • 原文地址:https://www.cnblogs.com/xl2432/p/10864146.html
Copyright © 2011-2022 走看看