找出数组中的主要元素(leetcode169)

题目

  • 给定一个长度为n的数组,找出主要元素,主要元素的定义是在数组中出现的次数超过n/2
  • 假设数组非空并且给定的数组中总是存在这样一个数
  • 举例,输入[3,2,3]输出3

解题思路1

  • 双重循环,内存循环遍历获得外层循环的值nums[i]出现的次数,然后和n/2比较,如果比n/2大就返回这个值,否则一直遍历到结束
  • 时间复杂度O(n^2),代码不贴了就是一个双重循环

解题思路2

  • 设置一个HashMap,键表示num[i],值表示num[i]出现的次数,然后遍历HashMap找到出现次数最多或者是大于n/2的那个数返回
  • 时间复杂度O(n),空间复杂度O(n)

解题思路3

  • 先对数组进行排序,根据题目要求,返回的是超过n/2的数据,那么排序后n/2的数据一定是我们要的数字,代码很简单两行实现
  • 时间复杂度O(nlogn),空间复杂度O(1)或者O(n)

代码三

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

解题思路4(参考官方思路,没想到的方法)

  • 投票算法,根据我们的需求可以选出一个num作为candidate,然后我们开始对数组进行遍历,如果这个数等于candidate那么我们就将票数加1,如果不等于就票数减一,如果票数为0那么我们就设定新的值为candidate,根据要求必然存在大于n/2那么最后票数值肯定大于0

代码实现

class Solution {
    public int majorityElement(int[] nums) {
        int candidates = nums[0];
        int times = 0;
        for (int num : nums) {
            if (times == 0) candidates = num;
            times += (num == candidates) ? 1 : -1;
        }
        return candidates;
    }
}

你可能感兴趣的:(找出数组中的主要元素(leetcode169))