C語言強化(五)輸出一串數中最小的 k 個

2022-08-26 19:24:06 字數 1630 閱讀 9540

有時候題目看似很簡單,似乎非常容易實現,但是,你考慮過效率了嗎?

通過這道題,你可以掌握

題目:輸入 n 個整數,輸出其中最小的 k 個。

例如輸入 1,2,3,4,5,6,7 和 8 這 8 個數字,則最小的 4 個數字為 1,2,3 和 4。

看到此題,第一反應就是對這串數字進行排序,然後遍歷角標0~3的數字列印出來,很簡單嘛~~

怎麼可以這麼簡單,仔細一看,題目只是要求最小的n個數字啊,這樣子對整個陣列進行排序有必要嗎?

只需要4個最小的,也就意味著只要乙個數比現有的4個最小數大,那麼我們就可以將它永遠永遠遺忘掉,而不是還把他插入到陣列中,把他插入到陣列中,等一下有新的值插進來,還要和他多比較一次,無形中增加了比較次數!

思路

寫乙個函式sorting(),能插入值並對陣列進行排序,注意原陣列已經排好順序

新建vector,遍歷所給陣列,

對於之前的4個元素,只是執行sorting函式

對於之後的元素,執行sorting函式,將最上面值pop出去

源**

#include #include#include #include#include using namespace std;

/**查詢最小的 k 個元素(陣列)

題目:輸入 n 個整數,輸出其中最小的 k 個。

例如輸入 1,2,3,4,5,6,7 和 8 這 8 個數字,

則最小的 4 個數字為 1,2,3 和 4。

思路寫乙個函式sorting(),能插入值並對陣列進行排序,注意原陣列已經排好順序

新建vector,遍歷所給陣列,

對於之前的4個元素,只是執行sorting函式

對於之後的元素,執行sorting函式,將最上面值pop出去

*//**

sorting

vt:所給陣列

value:要插入的值

從頂到底遍歷vector

如果value比遍歷到的結點值小,則交換位置

否則,因為原陣列已經排好順序,後面的數都比當前的數小,所以停止,跳出迴圈

*/void sorting(vector&vt,int value) }}

void main()

{ vectorfinalvt;

vectororivt;

//建立原陣列

orivt.push_back(2);

orivt.push_back(-1);

orivt.push_back(4);

orivt.push_back(0);

orivt.push_back(1);

orivt.push_back(12);

orivt.push_back(3);

//顯示原陣列

cout<

執行圖

演算法的優化,可以理解為乙個詞:吝嗇

多一步浪費,多一分錢都不給!可以比較10次計算出來的,絕對不比較11次!

c set求一群數中最小的k個數

問題描述 輸入n個整數,找出其中最小的k k n 個不同數。例如輸入4,5,1,6,1,7,3,8這8個數字,則最小的4個數字是1,3,4,5。輸入形式 每個測試案例包括2行 第一行為2個整數n,k 1 n,k 200000 表示陣列的長度。第二行包含n個整數,表示這n個數,陣列中的數的範圍是 0,...

C語言輸出唯一的子串

給乙個字串,求長度為m的所有不重複的子串。比如字串 aaab 我們求長度為2的子串,那麼依次為 aa aa ab 那麼不重複的子串為 aa ab 第一行是乙個整數k,表示樣例的個數。每個樣例的第一行是乙個整數m,表示所求子串的長度。第二行是乙個字串,字串全部由小寫英文本母組成,長度不超過100。按字...

C語言 輸出字串中最長的乙個大小寫字母組合

首先讀乙個字元,判斷該字元是否為字母 如果該字元為字母,則存入字母緩衝區,如果該字母後面為結束符,則記錄該字母組合的長度 起始和結束下標。如果該字元不是字母,但該字元的前乙個字元是字母,則記錄該字母組合的長度 起始和結束下標。清空字母緩衝區。如果該字元不是字母且其前乙個字元也不是字母,則讀取下乙個字...