有時候題目看似很簡單,似乎非常容易實現,但是,你考慮過效率了嗎?
通過這道題,你可以掌握
題目:輸入 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語言 輸出字串中最長的乙個大小寫字母組合
首先讀乙個字元,判斷該字元是否為字母 如果該字元為字母,則存入字母緩衝區,如果該字母後面為結束符,則記錄該字母組合的長度 起始和結束下標。如果該字元不是字母,但該字元的前乙個字元是字母,則記錄該字母組合的長度 起始和結束下標。清空字母緩衝區。如果該字元不是字母且其前乙個字元也不是字母,則讀取下乙個字...