为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode229. 求众数 II | Majority Element II

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10204770.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.

Note: The algorithm should run in linear time and in O(1) space.

Example 1:

Input: [3,2,3]
Output: [3]

Example 2:

Input: [1,1,1,3,3,2,2,2]
Output: [1,2]

给定一个大小为 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

输入: [3,2,3]
输出: [3]

示例 2:

输入: [1,1,1,3,3,2,2,2]
输出: [1,2]

96ms
 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         guard nums.count > 1 else {
 4             return nums
 5         }
 6         
 7         var majorA = nums[0]
 8         var countA = 0
 9         
10         var majorB = nums[0]
11         var countB = 0
12         
13         for index in 0...(nums.count-1) {
14             if nums[index] == majorA {
15                 countA += 1
16                 continue
17             } 
18             
19             if nums[index] == majorB {
20                 countB += 1
21                 continue
22             }
23             
24             if countA == 0 {
25                 majorA = nums[index]
26                 countA += 1
27                 continue
28             }
29             
30             if countB == 0 {
31                 majorB = nums[index]
32                 countB += 1
33                 continue
34             }
35 
36             countA -= 1
37             countB -= 1
38         }
39         
40         countA = 0
41         countB = 0
42         for index in 0...(nums.count - 1) {
43             if nums[index] == majorA {
44                 countA += 1
45             } else if nums[index] == majorB {
46                 countB += 1
47             }
48         }
49                 
50         var result = [Int]()
51         if countA > nums.count/3 {
52             result.append(majorA)
53         }
54         if countB > nums.count/3 {
55             result.append(majorB)
56         }
57         
58         return result
59     }
60 }

104ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3 
 4         var res = [Int]()
 5         var cm = 0, cn = 0, m = 0, n = 0
 6         for a in nums {
 7             if a == m { cm += 1 }
 8             else if a == n { cn += 1 }
 9             else if cm == 0 { m = a; cm = 1}
10             else if cn == 0 { n = a; cn = 1 }
11             else { cm -= 1; cn -= 1}
12         }
13         cm = 0; cn = 0
14         for a in nums {
15             if a == m { cm += 1 }
16             else if a == n { cn += 1 }
17         }
18         if cm > nums.count / 3 {res.append(m)}
19         if cn > nums.count / 3 {res.append(n)}
20         return res
21     }
22 }

112ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         var elems: [Int: Int] = [:]
 4         for n in nums {
 5             elems[n, default: 0] +=  1
 6         }
 7         return elems.compactMap { key, value in 
 8             if value > nums.count / 3 { return key } 
 9             return nil 
10         }
11     }
12 }

112ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         var dict:[Int : Int] = [Int:Int]()
 4         for num in nums {
 5             if let n = dict[num] {
 6                 dict[num] = n + 1
 7             } else {
 8                 dict[num] = 1
 9             }
10         }
11         var r = [Int]()
12         let m = nums.count / 3
13         for (k,v) in dict {
14             if v > m {
15               r.append(k)
16             }
17         }
18         return r
19     }
20 }

116ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         
 4         if nums.count == 0 {
 5             return []
 6         }
 7         
 8         var dict: [Int: Int] = [:]
 9         var resultList: Set<Int> = []
10         let limit = nums.count/3
11         
12         for number in nums {
13             var result = 1
14             if let temp = dict[number] {
15                 result = temp + 1
16             }
17             dict[number] = result
18             
19             if result > limit {
20                 resultList.insert(number)
21             }
22         }
23         
24         return Array(resultList)
25     }
26 }

124ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         
 4         if nums.count == 0 {
 5             return []
 6         }
 7         
 8         var dict: [Int: Int] = [:]
 9         var resultList: [Int] = []
10         let limit = nums.count/3
11         
12         for number in nums {
13             var result = 1
14             if let temp = dict[number] {
15                 result = temp + 1
16             }
17             dict[number] = result
18             
19             if result > limit && !resultList.contains(number){
20                 resultList.append(number)
21             }
22         }
23         
24         return resultList
25     }
26 }

140ms

 1 class Solution {
 2     func majorityElement(_ nums: [Int]) -> [Int] {
 3         var dict = [Int: Int]() 
 4         var r = [Int]()
 5         for n in nums {
 6             dict[n, default: 0] += 1
 7             if dict.keys.count == 3 {
 8                 for key in dict.keys {
 9                     dict[key, default: 0] -= 1
10                     if dict[key, default: 0] == 0 {
11                         dict[key] = nil
12                     }
13                 }
14             }
15         }
16         let c = nums.reduce(into: [Int: Int]()){ $0[$01, default: 0] += 1 }
17         return Array(dict.keys).filter { c[$0, default: 0] > nums.count / 3 }
18     }
19 }

156ms

 1 class Solution {
 2    func majorityElement(_ nums: [Int]) -> [Int] {
 3         var res = [Int:Int].init()
 4         
 5         for i in 0..<nums.count {
 6             if res.keys.contains(nums[i]){
 7                 let value = res[nums[i]]!+1
 8                 res[nums[i]] = value
 9             }else{
10                 res[nums[i]] = 1
11             }
12         }
13         
14         let dict = res.filter { (arg) -> Bool in
15             
16             let (_, value) = arg
17             return value > nums.count/3
18         }
19         return Array(dict.keys)
20     }
21 }

 

posted @ 2019-01-01 14:34  为敢技术  阅读(253)  评论(0编辑  收藏  举报