题目

https://leetcode-cn.com/problems/majority-element/
image.png

题解

  1. var majorityElement = function(nums) {
  2. const half = nums.length / 2
  3. let map = new Map()
  4. for(let item of nums) {
  5. if (map.get(item) === undefined) {
  6. map.set(item, 1)
  7. } else {
  8. map.set(item, map.get(item) + 1)
  9. }
  10. // 重新get一次
  11. if (map.get(item) > half) {
  12. return item
  13. }
  14. }
  15. return 0
  16. };

思路

使用一个Map对象存储出现的元素和次数, 当一个元素的出现次数>=数组的一半的时候 返回这个元素

参考

  1. 对象法:使用对象存储对应的元素和次数,和我的解题类似(我的是map对象)

    • 时间复杂度: O(n) 遍历一次
    • 空间复杂度: O(n) obj中属性最多为 n/2 个
      1. var majorityElement = function(nums) {
      2. let half = nums.length / 2
      3. let obj = {}
      4. for(let num of nums){
      5. obj[num] = (obj[num] || 0) + 1
      6. if(obj[num] > half) return num
      7. }
      8. };
  2. 排序法:但是很多面试题不允许使用这些现有的方法

    • 时间复杂度 O(nlogn) 使用了快速排序
    • 空间复杂度 O(1) 原地修改数组
      1. var majorityElement = function(nums) {
      2. nums.sort((a,b) => a - b)
      3. return nums[Math.floor(nums.length / 2)]
      4. };
  3. 栈方法:当 元素和栈顶元素相等 或 空栈 时入栈,否则出栈。最后栈中剩下的必然都是是大于一半的那个元素

    • 时间 O(n) 循环一次nums
    • 空间 O(n)
      1. var majorityElement = function(nums) {
      2. let stack = []
      3. for(let n of nums){
      4. let m = stack.length
      5. if(stack[m - 1] === n || !m){
      6. stack.push(n)
      7. } else {
      8. stack.pop()
      9. }
      10. }
      11. return stack[0]
      12. };