一、题目
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
点击查看原题
难度级别: 简单
二、思路
1)投票+验证
如果一个数出现的次数大于这个数组长度的一半,使用投票算法可以得到这个数:
用候选人变量记录选中的元素和该元素出现的次数,在遍历的时候,如果出现非候选人变量,则候选人变量出现次数减一,当减到0,就更换候选人变量的值为当前遍历到的数组元素,由于主要元素出现次数大于数组长度的一半,一定可以获得主要元素(如果存在的话)
考虑到没有主要元素的情况,需要遍历一遍数组,将候选人变量出现的次数记录一下,判断是否主要元素
三、代码
1)投票+验证
class Solution {public int majorityElement(int[] nums) {int num = nums[0];int cnt = 1;for (int i = 1; i < nums.length; i++) {if (num == nums[i]) {cnt++;} else {cnt--;if (cnt == 0) {num = nums[i];cnt = 1;}}}cnt = 0;for (int i : nums) {if (i == num) {cnt++;}}return cnt > nums.length/2 ? num : -1;}}
时间复杂度为O(N),空间复杂度为 O(1)
