题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2
限制:
1 <= 数组长度 <= 50000
解题思路1:
由于要寻找的是出现次数超过数组长度一半的数字,首先想到的数组进行排序,其次就发现所要寻找的数字就是数组最中间的数字。
代码1:
public static int majorityElement(int[] nums) { Arrays.sort(nums); return nums[(nums.length)/2]; }
解题思路2:
摩尔算法:
每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
这里利用count模拟摩尔投票。
代码2:
public static int majorityElement(int[] nums) { int number = 0;//记录取出的数据 int count = 0;//记录取出数据去掉每次比较后不同的数字的个数 for (int i = 0; i < nums.length; i++) { if (count == 0) {//count为0时才放入数据,否则一直在抵消不相同的数据 number = nums[i]; } if (nums[i] != number) { count--; }else { count++; } } return number; }