無序陣列 刪除出現超過k次的元素

2021-10-02 20:56:13 字數 1169 閱讀 4424

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...