Q1. 多数元素
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 [n/2] 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。
解题思路:
-
确定切分的终止条件:
-
- 直到所有的子问题都是长度为 1 的数组,停止切分。
-
准备数据,将大问题切分为小问题
-
- 递归地将原数组二分为左区间与右区间,直到最终的数组只剩下一个元素,将其返回
-
处理子问题得到子结果,并合并
-
长度为 1 的子数组中唯一的数显然是众数,直接返回即可。
-
如果它们的众数相同,那么显然这一段区间的众数是它们相同的值。
-
如果他们的众数不同,比较两个众数在整个区间内出现的次数来决定该区间的众数
-
python 实现 :
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 【不断切分的终止条件】
if not nums:
return None
if len(nums) == 1:
return nums[0]
# 【准备数据,并将大问题拆分为小问题】
left = self.majorityElement(nums[:len(nums)//2])
right = self.majorityElement(nums[len(nums)//2:])
# 【处理子问题,得到子结果】
# 【对子结果进行合并 得到最终结果】
if left == right:
return left
if nums.count(left) > nums.count(right):
return left
else:
return right
s = Solution()
print(s.majorityElement([1,2,3,4,5,3,3,3]))
golang实现
这里使用的是循环:
package main
import (
"fmt"
)
func majorityElement(nums []int) int {
res, count := nums[0], 0
for i := 0; i < len(nums); i++ {
if count == 0 {
res, count = nums[i], 1
} else {
if nums[i] == res {
count++
} else {
count--
}
}
}
return res
}
func main() {
nums := [...]int{1, 2, 3, 3, 3, 3, 3}
fmt.Println(majorityElement(nums[:]))
}