有 n 個無序整數,則找出其中最大的 M 個數字所需要的最小時間複雜度:
有 n 個無序整數( n>10000), 則找出其中最大的 M 個數字(5< M<10), 所需要的最小時間複雜度:
看了很多部落格和論壇,這道題我找到了兩種方法,在這裡總結一下。
兩種方法都用到了堆排序,那麼首先回顧一下堆排序:
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序.
第一種演算法:
直接對n個數進行堆排序,每次建立一個大根堆,只需完成排序的前m次。這種的方法時間複雜度是O(mlogn),每建立一次大根堆需要 logn 的時間,總共m次。
第二種演算法:
最開始選取前m個數,用這m個數建立一個小根堆。接下來,對後面n-m個數進行遍歷,用根結點與這n-m個數進行比較,當發現一個數比根結點大時,交換,然後重新建立一個小根堆。最終我們可以得到m個最大的數字。這種方法的時間複雜度是O(nlogm).
相關推薦
有 n 個無序整數,則找出其中最大的 M 個數字所需要的最小時間複雜度:
有 n 個無序整數( n>10000), 則找出其中最大的 M 個數字(5< M<10), 所需要的最小時間複雜度: 看了很多部落格和論壇,這道題我找到了兩種方法,在這裡總結一下。 兩種方法都用到了堆排序,那麼首先回顧一下堆排序:
有3個字串,要求找出其中最大者
這道題目和我之前blog中和矩陣求值中使用的演算法是一樣的,都是使用打擂臺演算法進行解題。 https://blog.csdn.net/qq_42766201/article/details/83651471 接下來我們來看下思路: 這道題首先需要設立3個二維字元陣列和1個臨時的陣列,兩兩對
依次從鍵盤輸入20個無序整數,刪除陣列重複元素並按從小到大排序
#include<stdio.h> //依次從鍵盤輸入20個無序整數,刪除陣列重複元素並按從小到大排序 #include #include using namespace std; #define maxn 1000 int
問題描述 給定一個序列,每次詢問序列中第l個數到第r個數中第K大的數是哪個。 輸入格式 第一行包含一個數n,表示序列長度。 第二行包含n個正整數,表示給定的序列。 第三個包含一個正整數m,表
#include<iostream> using namespace std; void print(int *a,int len) { int i=0; for(;i<len;++i) cout<<i+1<<':'<<
給定單鏈表,檢測是否有環。如果有環,則求出進入環的第一個節點
判斷單向連結串列是否有環,可以採用快指標與慢指標的方式來解決。即定義一個快指標fast和一個慢指標slow,使得fast每次跳躍兩個節點,slow每次跳躍一個節點。如果連結串列沒有環的話,則slow與fast永遠不會相遇(這裡連結串列至少有兩個節點);如果有環,則fast與slow將會在環中相遇。判斷出
求1到n ,這n個整數的二進位制表示位元1的個數(時間複雜度:O(n))
題目描述: 給定一個數字n,統計1~n之間的n個數字的二進位制的1的個數 int Nums_Of_Bit_1(int num) { int* number = new int[num]
入若干個正整數,判斷每個數從高位到低位各位數字是否按值從小到大排列,請根據題意,將程式補充完整。
#include <stdio.h> int fun1(int m); int main(void) { int n; scanf("%d", &n); while (n > 0) { if(fun1
Linux運維之批量下載指定網站的100個圖片檔案,並找出大於200KB的檔案
題目為: 有一百個圖片檔案,它們的地址都是 http://down.fengge.com/img/1.png http://down.fengge.com/img/2.png … 一直到 http://down.fengge.com/img/100.png 批量下載這10
《劍指offer》給定一顆二叉搜尋樹,請找出其中的第k大的結點。
題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。 解析:看到我寫的下面的程式碼,像一篇文章一樣的長,我也是醉了,先提交上去了。思想就是先來個層次遍歷二叉樹,得
題目四:給定一個數組,值可以為正、負和0,請返回累加和小於等於k的最長子陣列長度。 時間複雜度:O(n)
import java.util.HashMap; /** * * 3、給定一個數組,值可以為正、負和0,請返回累加和小於等於k的最長子陣列長度。 時間複雜度:O(n) * * 這裡需要分為兩步,第一步是獲取,以每個位置開頭最小和的長度。第二步,從0到N逐
輸入一行字元,分別統計出其中 #號、空格、數字和其它字元的個數
var str = “busdgdj 2# 1239 jdka# m2”; var v1 = 0, v2 = 0, v3 = 0, v4 = 0; for (var i = 0; i < str.length; i++) { if (str[i] == “#”) v1++; else
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
解題思路: 1、最簡單方法,先排序,再取前k個,時間複雜度O(NlogN) class Solution { public: vector<int> GetLeastNumbers
23.輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
題目:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 import java.util.ArrayList; public
SDUT 3503 有兩個正整數,求N!的K進制的位數
pos class 進制 amp code cpp ref clu lan 有兩個正整數,求N!的K進制的位數 題目鏈接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob
某產品使用A、B、C三種零件組裝而成,三種零件分別由三個相應的零件車間生產。零件組裝則由裝配車間完成,裝配車間有三個分別存放三種零件的貨架S1,S2,S3,分別可存放最多m個A零件,n個B零件,k個C
某產品使用A、B、C三種零件組裝而成,三種零件分別由三個相應的零件車間生產。零件組裝則由裝配車間完成,裝配車間有三個分別存放三種零件的貨架S1,S2,S3,分別可存放最多m個A零件,n個B零件,k個C零件,每件產品分別使用A,B,C三種零件各一個裝配而成,請採
輸入n個整數,找出其中最小的K個數
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.si
今天大家做的一個比賽題:有6個檔案,每個檔案裡大約200w整數,每行一個找出所有檔案裡最大的一個數字
題目二:考察處理大資料量能力 (難度:★★) 有6個檔案,每個檔案裡大約200w整數,每行一個 找出所有檔案裡最大的一個數字實現方法: package com.yxie.test.data; import com.magnanimityData.test.constant.
找出一定範圍內多個連續整數,使其立方之和恰好等於另一個整數的立方
es2017 nbsp 現實 png 提高 定位 http ati class 題目如圖,關於這道題的第一問比較簡單,只需驗證式子兩邊是否相等即可。這裏主要做一下第二問。 此題要求找出多個連續整數的立方和使其恰好等於另一個整數的立方,因為並沒有明確給出相應的條件,比
作業題:輸入4個整數,找出其中最大的數。用一個函數來實現. 分別使用結構化方法和函數嵌套的方法。
system 是否 進行 如果 div 使用 clu 函數 整型 之前在main()函數中的思路是: #include <iostream> using namespace std; int main(){ //求四個數中最大的數? /
輸出4個整數,找出其中最大的數。用函數嵌套調用來處理
函數返回值 integer return 另一個 pos 結果 圖片 個數 數值 /* p183 例7.5 輸出4個整數,找出其中最大的數。用函數嵌套調用來處理 解題思路:這個問題並不復雜,完全可以只用一個主函數就可以得到結果。在main函數中調用max4函數,max4函數