8-数组-多数元素 II

这是数组的第8篇算法,力扣链接。

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

示例 1:

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

示例 2:

输入:nums = [1]
输出:[1]

示例 3:

输入:nums = [1,2]
输出:[1,2]

这个和之前的求众数的区别是,这回求的是1/3的数。老规矩的排序返回1/2的逻辑肯定不行了。先上这道题的标准解法投票法试试吧。

投票法也不能直接用,投票法是抵消的逻辑,如果是1/3,也会被抵消掉,这里考虑投两票,即两个元素每个达到1/4就会入选,最后在比较是否大于1/3.

func majorityElement(nums []int) []int {
	num1, num2 := -1, -1
	count1, count2 := 0, 0
	for _, num := range nums {
		if count1 > 0 && num1 == num {
			count1++
		} else if count2 > 0 && num2 == num {
			count2++
		} else if count1 == 0 {
			num1 = num
			count1++
		} else if count2 == 0 {
			num2 = num
			count2++
		} else {
			count1--
			count2--
		}
	}
	cnt1, cnt2 := 0, 0
	for _, num := range nums {
		if count1 > 0 && num == num1 {
			cnt1++
		}
		if count2 > 0 && num == num2 {
			cnt2++
		}
	}

	var result []int
	if count1 > 0 && cnt1 > len(nums)/3 {
		result = append(result, num1)
	}
	if count2 > 0 && cnt2 > len(nums)/3 {
		result = append(result, num2)
	}
	return result
}

你可能感兴趣的:(白话算法,算法,数据结构)