229.多数元素 II

44 阅读1分钟

题目:
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
算法:
要先判断num[i] 是否与num1,num2相等,都不相等,再判断count1,count2是否为0,顺序很重要。

func majorityElement(nums []int) []int {
	num1, num2 := 0, 0
	count1, count2 := 0, 0
	ans := make([]int, 0)
	for i := 0; i < len(nums); i ++ {
		if num1 == nums[i] {
			count1 ++
		} else if num2 == nums[i] {
			count2 ++
		} else if count1 == 0 {
			num1 = nums[i]
			count1 ++
		} else if count2 == 0 {
			num2 = nums[i]
			count2 ++
		} else  {
			count1 --
			count2 --
		}
		// fmt.Println(num1,count1,num2,count2)
	}
	
	count1, count2 = 0, 0
	for i := range nums {
		if nums[i] == num1 {
			count1 ++
		}
		if nums[i] == num2 {
			count2 ++
		}
	}
	if count1 * 3 > len(nums)  {
		ans = append(ans, num1)
	}
	if num1 != num2 && count2 * 3 > len(nums) {
		ans = append(ans, num2)
	}
	return ans
}