高薪算法+计算机职称考试LeetCodeSwift in LeetCode

LeetCode 169. 求众数 Majority Eleme

2019-07-29  本文已影响9人  1江春水

【题目描述】
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。

【示例1】

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

【示例2】

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

【思路1】哈希表
1、遍历一遍 遍历一遍数组 使用map记录
2、返回次数大于 ⌊ n/2 ⌋ 的元素
3、时间复杂度O(n)
4、空间复杂度O(n)

func majorityElement(_ nums: [Int]) -> Int {
    var map = [Int:Int]()
    for num in nums {
        var value = map[num] ?? 0
        value+=1
        map[num] = value
    }
    for (k,v) in map {
        if v > nums.count/2 {
            return k
        }
    }
    return 0
}

【思路2】排序
1、如果所有单调递增或者单调递减的数组,那么这个数组的众数为arr[ ⌊ n/2 ⌋]
2、时间复杂度O(nlogn)
3、空间复杂度O(n)
4、LeetCode上内部给的例子报错!

func majorityElement(_ nums: [Int]) -> Int {
    let arr = nums.sorted()
    return arr[nums.count/2]
}

【思路3】抵消思想,也叫摩尔投票算法 <这个想法好牛🐂>
1、初始化 众数 num 和 count
2、遍历数组,我们假设第一个数就是众数 num
3、当是众数的时,count+1,是其他数时 count-1,当count==0时,下一个数又被当成是众数,依次遍历数组,这样来回抵消,最后count肯定会大于1,那么返回最后的num即可
4、时间复杂度O(n) 线性时间
5、空间复杂度O(1)

func majorityElement(_ nums: [Int]) -> Int {
    var count = 0
    var tmp = 0
    for num in nums {
        if count == 0 {
            tmp = num
        }
        count+=(tmp == num) ? 1 : -1
    }
    return tmp
}
上一篇下一篇

猜你喜欢

热点阅读