786. 第k个数】的更多相关文章

AcWing 786.第k个数 题目描述 给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在1~109109范围内),表示整数数列. 输出格式 输出一个整数,表示数列的第k小数. 数据范围 1≤n≤1000001≤n≤100000,1≤k≤n 输入样例: 5 3 2 4 1 5 3 输出样例: 3 思路 题目中要求使用快速选择排序,思路同快速排序,但是在进行递归处理的时候进行选…
题目传送门 一.理解感悟 1.这是快速排序模板的练习题. 2.不一样的地方在于它可以利用快排模板,但却不需要真的把所有数据排序完成,每次一分为二后,只关心自己所有的那一半,就是可以节约一半的递归. 3.由于是关心"位置"(第几个),所以需要携带这个参数. 4.位置这个参数不是一成不变的,因为如果在左侧,那么就是原来的位置,如果在右侧,那就需要减去整个左侧的长度. 二.C++代码 #include <bits/stdc++.h> using namespace std; co…
一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数.这种思路的时间复杂度是O(nlogn),但是面试官会要求时间复杂度保持在O(n). 二.解题思路 2.1 需要修改数据源的O(n)解法 基于快速排序中的Partition函数来解决这个问题.如果基于数组的第k个数字来调整,使得比第k个…
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -----------------------------------------------------------------------------------------   转载自http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/26247…
参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 总体思路: 取n个数字的前k个数字构建大根堆,设根顶元素为kmax, 从n-k+1开始遍历剩余的n-k个元素,取出每一个元素和大根堆根元素进行比较,如果kmax>遍历到的元素值,则kmax=遍历到的元素…
问题描述: 输入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…
被这道题困了好久,看了剑指Offer才知道OJ上的要求有点迷惑性. 题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 一直以为要按照顺序输出,想的方法是插入排序算法复杂度是O(N*K),当然这个地方就显得自己有点蠢了.不过我想在“按序输出”的错误题意下还没有啥更好的方法. 然后看了剑指Offer原书,原来输出不必按照顺序.所以第一种方法是快速选择.这种方法算法复杂度是O(N).不过在实际的使用中可能有点隐含的时间参数…
有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2个多小时,反思,太慢了. 注意边界条件,不要混混沌沌的. /************我自己的解法*****************/ //选择数组a[N]中最大的第k个数 int Select(int * a, int N, int k) { if(k > N || a == NULL) { cou…
1046: 最小的K个数 时间限制: 1 Sec  内存限制: 128 MB提交: 233  解决: 200[提交][状态][讨论版] 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入 每个测试案例包括2行: 第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度. 第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]. 输出 对应每个测试案例,输出最小的k…
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边. 这个函数可以如下实现: int Partition(int data[], int length, int start, int end) { if(data == NULL || length <= 0 || start < 0 || end >= length) throw new std::exception("Inv…
http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数. 解法一: 使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过. 解法二: 使用二分的方法.算法思想在代码注释中 #include <iostream> #include <string.h> #include <stdlib.h>…
一.题目描述 输入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…
// 最小的k个数.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <set> #include <vector> #include <queue> using namespace std; // set中默认是从大到小的顺序,即最先取出的是最小值 // 此处为从小到大,最先取出的是最大值 typedef multiset<int,gr…
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情况下可以模拟其他数据结构,Queue库提供了栈和队列,甚至优先队列(和最小堆类似),heapq提供了最小堆,树,链表的指针在python中可以当作最普通的变量,所以python大法好...使用python确实可以把程序员从复杂的数据结构中解放开来,重点关注算法.好了言归正传. 题目 前几天看到了一个…
题目:n个数中,求最小的前k个数. 这道题在各个地方都看到过,在国内出现的频率也非常高. 面完阿里回来听说这道题又被考了,所以还是决定回来写一写,对于这种高频题...顺便再吐槽一下阿里的面试,我竟然一道题都不用做,只是纯粹地过简历...导致我都不知道我究竟错在哪里. 解法: 1. brute force. O(k*n)复杂度: 2. sort.O(k+n*lgn)复杂度: 3. 最大堆.每次替代的是大小为k的最大堆的最大值.O(k+(n-k)lgk)复杂度. int findKthByHeap(…
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如果大于最大元素则忽略,如果小于最大元素则将次元素送入堆中,并将堆的最大元素删除,调整堆的结构; 方法3:使用快速排序的原理,选择出数组中第K大的元素,select(a[], k, low, high) 选取数组中a[high]为基准,将数组分割为A1和A2,A1中的元素都比a[high]小,A[2]中的元素都…
编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array, int low, int high, int k, out int value) { int i = low; int j = high; int tempItem = array[low]; value = int.MinValue; while (low < high) { while (a…
[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *[思路]排序,去除k后的数. package com.exe11.offer; import java.util.ArrayList; import java.util.Collections; /** *[题目] 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *[思路]排序,去除k后…
输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint uiK, int * pOutputArray); 输入参数: unsignedint uiInputNum //输入整数个数 int * pInputArray  //输入整数数组 unsignedint uiK   //需输出uiK个整数 输出参数(指针指向的内存区域保证有效): int * p…
在<剑指offer>上看到的,而且Qunar去年的校招笔试也考了这题,今天晚上去西电腾讯的宣讲会,来宣讲的学长也说他当时一面的时候面试官问了“一亿个数据的最大的十个数”的面试题.今晚就写写最大 / 最小 的K个数的解题思路吧! 第一次见这个类型的题应该就是看Qunar的去年的校招笔试题,题目好像是一亿个数据,输出最大的100个数据.当时脑子里面的第一个想法就是维护一个100个数据的升序 / 降序数组,然后开始对数据开始一个一个的遍历,比较.然后就觉得自己好傻,那样肯定时间复杂度不行.后来看到的…
//求n个数中的最小k个数        public static void TestMin(int k, int n)        {            Random rd = new Random();            int[] myArray = new int[n];            int[] newArray = new int[k]; for (int i = 0; i < n; i++)            {                // rand…
题目: 输入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个整数: 堆是基于二叉树来实现的,因…
包含了Partition函数的多种用法 以及大顶堆操作 /************************************************************************* > File Name: 28_KLeastNumbers.cpp > Author: Juntaran > Mail: JuntaranMail@gmail.com > Created Time: 2016年08月31日 星期三 19时45分41秒 **************…
[面试题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…
寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有更多的元素呢? 答:那可以改为:int array[1000] …… 问:如果我们有很多元素,例如1亿个浮点数,怎么办? 答:个,十,百,千,万……那可以写:float array [100 000 000] …… 问:这样的程序能编译运行么? 答:嗯……我从来没写过这么多的0 …… 分析与解法 […
描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3). 输入 测试样例组数不超过10 每个测试案例包括2行: 第一行为2个整数n,k(1<=k<=n<=100000) 第二行包含n个整数,每个整数的范围为[1~2000] 输出 对应每个测试案例,输出最小的k个数之和. 样例输入 8 4 5 2 1 3 8 1 9 3 样例输出 7 #include <stdio.h> #in…
题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度. 第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]. 输出: 对应每个测试案例,输出最小的k个数,并按从小到大顺序打印. 样例输入: 样例输出: 解题思路: 我们通过快排找到第k个数,然后比他的小的都在左边,比他大的都在右…
public class MinHeap { /* * * Top K个问题,求给定数据中最小的K个数 * * 最小堆解决:堆顶元素为堆中最大元素 * * * */ private int MAX_DATA = 10;//最小10个数 private int[] data;//存储数据 private int len;//当前存储长度,考虑到元素个数可能没有10个,这个时候全部输出 private MinHeap() { data = new int[MAX_DATA]; len=0; } pr…
最小K个数之和 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4,则输出最小的4个数之和为7(1,1,2,3).   输入 测试样例组数不超过10每个测试案例包括2行:第一行为2个整数n,k(1<=k<=n<=100000)第二行包含n个整数,每个整数的范围为[1~2000] 输出 对应每个测试案例,输出最小的k个数之和. 样例输入 8 4 5 2 1…
题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行:第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度. 第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]. 输出: 对应每个测试案例,输出最小的k个数,并按从小到大顺序打印. 样例输入: 8 4 4 5 1 6 2 7 3 8 样例输出: 1 2 3 4 此题的不同之处是最后的输…