assert:當 i 指i針指向第 i 個元素的時候,保證前 i -1 個元素都是滿足條件的,即,需要保留的。
所以:假如前 i - 1 個元素中有與第 i 個元素相同的,保留第 i 個元素,否則掃瞄陣列,數數。
若出現次數小於k次,將所有和當前元素相等的元素都移到陣列的末尾,當然,和a[i]相等的只可能在 i 後面出現。
void
filter_1
(int
*a,int
& n,
int countthreshold)
}//若i在前面出現過,count=countthreshold-->不會進入這個迴圈
//數數
for(
int j = i +
1; j < n && count < countthreshold; j++)if
(a[j]
== a[i]
) count++
;// count += a[j] == a[i];
if(count < countthreshold)
//去掉所有的該元素
}else
i++;//否則,檢查下乙個元素
}}
新建乙個大小為 k 的陣列
locs[k] = j;表示,當前a[i]這個元素,出現第k次,是在位置j。
比如:當前 i = 3, a[i] = 4, 且第 5,7 個元素都是4,則
locs[0] = 3, locs[1] = 5, locs[2] = 7。
void
filter_1b
(int
*a,int
& n,
int countthreshold)
}for
(int j = i +
1; j < n && count < countthreshold; j++)if
(a[j]
== a[i]
)//到此為止與上一種相同
if(count < countthreshold)
n -= count;
}else
i++;}
delete
locs;
}
這兩種方法雖然**比較複雜,但比單純的兩重迴圈要少一些掃瞄 求無序陣列中元素出現次數超過陣列長度一半的數字
求無序陣列中元素出現次數超過陣列長度一半的數字.首先給出幾個 元素出現次數超過陣列長度一半 測試陣列 a1 7 a2 5 a3 9 不難發現 陣列中如果乙個數字出現次數超過數字長度的一半.如果把這個陣列排序,那麼排序後的陣列中間的數字一定是出現次數超過數字長度的一半.如陣列a1長度為7,按從小到大排...
由無序陣列中找到第K 大的元素
當然如果我們想要實現這個問題會有很多思路,可以將原來的陣列進行排序即可,直接隨機訪問到第k個元素即可。我們專門寫一篇部落格當然不是想利用這種思路的,可以試試改進的快速排序啊,對不,我個人覺得是利用了兩種思路乙個是快速排序乙個是二分查詢,在進行快速排序的時候,在指定範圍內找到該值的下標,如果該下標與k...
無序陣列中最小的k個數
對於乙個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數,順序與原陣列中元素順序一致。給定乙個整數陣列a及它的大小n,同時給定k,請返回其中最小的k個數。測試樣例 1,2,4,3 4,2返回 1,2 簡單題 coding utf 8 class kthnumbers def findkt...