如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
題目鏈接
LeetCode 229. 求眾數(shù) II[1]
題目描述
給定一個大小為
的數(shù)組,找出其中所有出現(xiàn)超過 次的元素。說明:
- 要求算法的時間復(fù)雜度為 ,空間復(fù)雜度為 。
示例1
輸入: [3,2,3] 輸出: 3示例2
輸入: [1,1,1,3,3,2,2,2] 輸出: [1,2]題解
這是求解眾數(shù)的升級版:【每日算法Day 90】5種方法:求解數(shù)組中出現(xiàn)次數(shù)超過一半的那個數(shù)[2] 但是這題沒有保證一定存在滿足條件的數(shù),不過不要緊。
首先可以肯定最多有兩個數(shù)的數(shù)量超過 1/3 ,這個就不用我過多解釋了吧。然后我們只需要找出出現(xiàn)次數(shù)最多的兩個數(shù),看它倆次數(shù)是否超過 1/3 就行了。
那么怎么找呢?如果存在某個數(shù)超過 1/3 ,那我們每次刪掉三個不同的數(shù),直到最后沒法刪,最后剩下的數(shù)一定有這個超過 1/3 的數(shù)。原因很簡單,因?yàn)槊縿h一次最多刪掉一個這個數(shù),而刪除最多 1/3 數(shù)組長度次之后所有數(shù)都被刪光了,但是這個數(shù)還剩下一點(diǎn)。
所以我們用兩個變量 cand1 和 cand2 表示兩個候選人,cnt1 和 cnt2 表示兩個候選人數(shù)量。那么如果兩個候選人有一個和當(dāng)前數(shù) x 相同,對應(yīng)的數(shù)量就加一。否則的話如果如果有某個候選人為空,就讓 x 頂替成為新的候選人。否則的話就說明兩個候選人都有,并且 x 和它倆都不相同,那么就同時刪除三個不同的數(shù),也就是兩個候選人數(shù)量各減一,同時刪去 x 。
最后判斷兩個候選人數(shù)量是否超過了 1/3 就行了。
這里關(guān)鍵點(diǎn)就在于,每次刪除三個不同的數(shù),判斷最后剩下的數(shù)是否符合題意就行了。
代碼
c++
class Solution { public:vector<int> majorityElement(vector<int>& nums) {int n = nums.size();int cand1 = 0, cand2 = 0, cnt1 = 0, cnt2 = 0;for (auto x : nums) {if (cand1 == x) {cnt1++;} else if (cand2 == x) {cnt2++;} else if (!cnt1) {cand1 = x;cnt1++;} else if (!cnt2) {cand2 = x;cnt2++;} else {cnt1--;cnt2--;}}cnt1 = cnt2 = 0;for (auto x : nums) {if (x == cand1) cnt1++;else if (x == cand2) cnt2++;}vector<int> res;if (cnt1 > n/3) res.push_back(cand1);if (cnt2 > n/3) res.push_back(cand2);return res;} };python
class Solution:def majorityElement(self, nums: List[int]) -> List[int]:n = len(nums)cand1, cand2, cnt1, cnt2 = 0, 0, 0, 0for x in nums:if cand1 == x:cnt1 += 1elif cand2 == x:cnt2 += 1elif cnt1 == 0:cand1 = xcnt1 = 1elif cnt2 == 0:cand2 = xcnt2 = 1else:cnt1 -= 1cnt2 -= 1cnt1 = cnt2 = 0for x in nums:if x == cand1:cnt1 += 1elif x == cand2:cnt2 += 1res = []if cnt1 > n//3:res.append(cand1)if cnt2 > n//3:res.append(cand2)return res 關(guān)注【算法碼上來】,每日算法干貨馬上就來!參考資料
[1]
LeetCode 229. 求眾數(shù) II: https://leetcode-cn.com/problems/majority-element-ii/
[2]
【每日算法Day 90】5種方法:求解數(shù)組中出現(xiàn)次數(shù)超過一半的那個數(shù): https://godweiyang.com/2020/04/04/leetcode-inteview-39/
總結(jié)
以上是生活随笔為你收集整理的如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python环境_python环境搭建教
- 下一篇: Python爬取网站用户手机号_设计师的