leetcode刷題筆記 229題 求眾數II
阿新 • • 發佈:2020-10-16
leetcode刷題筆記 229題 求眾數II
源地址:229. 求眾數 II
問題描述:
給定一個大小為 n 的陣列,找出其中所有出現超過 ⌊ n/3 ⌋ 次的元素。
進階:嘗試設計時間複雜度為 O(n)、空間複雜度為 O(1)的演算法解決此問題。
示例 1:
輸入:[3,2,3]
輸出:[3]
示例 2:輸入:nums = [1]
輸出:[1]
示例 3:輸入:[1,1,1,3,3,2,2,2]
輸出:[1,2]提示:
1 <= nums.length <= 5 * 104
-109 <= nums[i] <= 109
//思想基於169題的摩爾投票演算法 //可推廣至N/K次元素,即構建K-1個候選人 object Solution { def majorityElement(nums: Array[Int]): List[Int] = { var cand1 = nums(0) var cand2 = nums(0) var count1 = 0 var count2 = 0 var res = new scala.collection.mutable.ListBuffer[Int]() for (i <- 0 to nums.length-1) { if (cand1 == nums(i)) { count1 += 1 } else { if (cand2 == nums(i)) { count2 += 1 } else { if (count1 == 0){ cand1 = nums(i) count1 += 1 } else if (count2 == 0){ cand2 = nums(i) count2 += 1 } else { count1 -= 1 count2 -= 1 } } } //println("-------"+ i +"--------") //println(cand1) //println(cand2) } count1 = 0 count2 = 0 for (num <- nums) { if (num == cand1) count1 += 1 if (num == cand2) count2 += 1 } if (count1 > nums.length/3) res.append(cand1) if (cand1 != cand2 && count2 > nums.length/3) res.append(cand2) return res.toList } }