6-数组-多数元素

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

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

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

示例 2:

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

 这道题的最暴力解法一定是打表计数,这里就不试了,太麻烦了,先来第二种暴力方法,排序后返回中点,因为超过n/2的数一定会在中点上。

func majorityElement(nums []int) int {
	sort.Slice(nums, func(i, j int) bool {
		return nums[i] < nums[j]
	})
	return nums[len(nums)/2]
}

然后可以试试分治的思想:

func majorityElement(nums []int) int {
	return majorityElementRec(nums, 0, len(nums)-1)
}

func majorityElementRec(nums []int, start int, end int) int {
	if start == end {
		return nums[start]
	}
	mid := start + (end-start)/2
	left := majorityElementRec(nums, start, mid)
	right := majorityElementRec(nums, mid+1, end)
	if left == right {
		return left
	}
	leftCount := countElement(nums, start, end, left)
	rightCount := countElement(nums, start, end, right)
	if leftCount > rightCount {
		return left
	}
	return right
}

func countElement(nums []int, start int, end int, target int) (result int) {
	for i := start; i <= end; i++ {
		if nums[i] == target {
			result++
		}
	}
	return result
}

最后试试这种题的经典投票法:

func majorityElement(nums []int) int {
	result, count := nums[0], 1
	for i := 1; i < len(nums); i++ {
		if count == 0 {
			result = nums[i]
		}
		if result != nums[i] {
			count--
		} else {
			count++
		}
	}
	return result
}

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