多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 :
输入:nums = [2,2,1,1,1,2,2]
输出:2
解题思路
可以利用摩尔投票法(Boyer-Moore Voting Algorithm)。这个算法的基本思想是:
- 维护一个候选众数,初始化为数组的第一个元素,然后遍历数组,
- 对于每个元素,如果计数为0,则将当前元素设置为候选众数,
- 否则如果当前元素等于候选众数,则计数加一,否则计数减一。
核心思想:通过抵消不同的元素,最终剩下的就是多数元素。
- 由于题目已经保证多数元素一定存在,且出现次数大于 ⌊ n/2 ⌋,所以这种投票法一定会得到正确的结果。
Java实现
public class MajorityElement {public static int majorityElement(int[] nums) {int candidate = nums[0];int count = 1;for (int i = 1; i < nums.length; i++) {if (count == 0) {candidate = nums[i];count = 1;} else if (nums[i] == candidate) {count++;} else {count--;}}return candidate;}public static void main(String[] args) {int[] nums = {3, 2, 4, 3, 4, 4, 2, 4, 4};System.out.println(majorityElement(nums));}
}
时间空间复杂度
-
时间复杂度:O(n),其中n为数组nums的长度。因为只需遍历一次数组。
-
空间复杂度:O(1)。