数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
示例 1:
输入:[1,2,5,9,5,9,5,5,5] 输出:5
示例 2:
输入:[3,2] 输出:-1
示例 3:
输入:[2,2,1,1,1,2,2] 输出:2
解法一:首先想到遍历数组字典计数,但是不满足需求 空间复杂度为 O(1)
func majorityElement(_ nums: [Int]) -> Int { let arr = nums var counts: [Int: Int] = [:] for item in arr { counts[item] = (counts[item] ?? 0) + 1 } for (key, value) in counts { if value > nums.count / 2 { return key } } return -1 }
解法二:摩尔投票算法,计数器 n = 1, 主要元素 value 取数组第一个。 先遍历数组,找出投票数最高的某个数 value (遍历数组时,若相同就加一,若不同就减一,当计数器为0时,重置计数器和主要元素),然后遍历数组,找出 value 的总个数。
func majorityElement(_ nums: [Int]) -> Int { var n = 1 var value = nums[0] for i in 1..<nums.count { if nums[i] == value { n += 1 } else { n -= 1 } if n == 0 { n = 1 value = nums[i] } } if n > 0 { var s = 0 for num in nums { if num == value { s += 1 if s > nums.count/2 { return value } } } } return -1 }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-majority-element-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。