面试题30.最小的k个数】的更多相关文章

问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void QuickSort(int[] arr, int start, int end){ if(start == end){ return; } int index = Partition(arr, start, end); if(index > start){ QuickSort(arr, start, ind…
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方法是parition方法,一种 方法是建立一个大小为k的堆进行topk求解 这里我们只解释第一种方法: 1.首先随机查找数组中一个元素作为一个基准,然后parition一次使得数组左边的元素小于基本,数组右边的元素大于基准. 2.此时将再将基准插入到数组适当的位置并返回该位置的索引. 3.如果索引i…
输入n个整数,找出其最小的k个数,例如输入4,5,1,6,2,7,3,8,最小的4个数为1,2,3,4 解法一:快排思想,会改变原数组    O(n) 注意是vector<int>& C++: class Solution { public: int Partition(vector<int>& input, int left , int right){ int k = left ; for (int i = left ; i < right ; i++){…
O(N)划分法,注意这个方法会改变原数据(函数参数是引用的情况下)!当然也可以再定义一个新容器对其划分 要求前k小的数,只要执行快排划分,每次划分都会把数据分成大小两拨.直到某一次划分的中心点正好在k处,则左侧0~k-1的数字正好就是所求. class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int n=input.size(); if(n==0 or k…
题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 限制: 0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000 代码: class Solution: def ge…
问题描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0]   限制: 0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000 代码 直接进行排序,时间复杂度\(O(N\l…
一.题目描述 输入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> GetLeast…
题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 1.排序 把输入的n个整数排序,然后取前k个数: 时间复杂度:O(nlogn) 2.Partition 通过partition找到第k大的数,它的左边就是前k小的数: 时间复杂度:O(n) 3.最大堆 构建k个整数的最大堆数据结构,然后将剩余n-k个整数依次与堆顶比较,大则抛弃,小则删除堆顶并插入,最后的最大堆就是最小的k个整数: 堆是基于二叉树来实现的,因…
题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 这个是O(nlogk)时间复杂度的思路:用一个容器来保存最先的k个数,这样每次来一个数时,用这个数和容器中k个数中的最大值进行比较:如果比最大值大,则舍弃:比最大值小,则删除最大值,并将该值加入容器.那么问题就是应该选用什么样的容器? 容器需要做3件事:一是在k个数中找最大值,二是删除最大值,三是插入新数.如果用二叉树来实现这个容器,则可以在O(logk)的…
[面试题030]最小的k个数 题目:     输入n个整数,找出其中最小的k个数.     例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4.     思路一:     可以同样的基于随机快速排序的Partition函数,来对数组做划分,     基于k来作调整,返回调用Partition函数,直到左边的k个数字是整个数组中最小的k个数字.     ps.这种方法要修改数组中数字的顺序,因为Partition函数会调整数组中数字的顺序.   123456789…