leetcode229求众数II

leetcode229 Majority Element II

Posted by BY on June 14, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的229题。

问题描述

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

示例 1:

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

示例 2:

输入: [1,1,1,3,3,2,2,2]
输出: [1,2]

分析:

此题和169题是一个思想

func majorityElement(nums []int) []int {
    nx, ny, cx, cy := 0, 0, 0, 0
    for _, n := range nums {
        if nx == n {
            cx++
        } else if ny == n {
            cy++
        } else if cx == 0 {
            nx = n
            cx++
        } else if cy == 0 {
            ny = n
            cy++
        } else {
            cx--
            cy--
        }
    }
    cx, cy = 0, 0
    for _, n := range nums {
        if n == nx {
            cx++
        } else if n == ny {
            cy++
        }
    }
    oneThird := len(nums) / 3 
    ret := make([]int, 0, 2)
    if cx > oneThird {
        ret = append(ret, nx)
    }
    if cy > oneThird {
        ret = append(ret, ny)
    }
    return ret
}

用map存储会快(虽然要求空间复杂度为1)

func majorityElement(nums []int) []int {
	stat, res, limit := map[int]int{}, []int{}, len(nums)/3
	for _, num := range nums {
		stat[num]++
	}
	for num, count := range stat {
		if count > limit {
			res = append(res, num)
		}
	}
	return res
}

总结:

勤思考。

结语

不管怎么样好好加油。