算法 |《剑指offer》面试题39.数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

题解:
class Solution {
    public int majorityElement(int[] nums) {
        //需要的数字出现次数多于一半,那么排序后这个数字必定位于中间,复杂度为O(nlogn)
        // Arrays.sort(nums);
        // return nums[nums.length / 2];
        // 也可以理解成混战极限一换一,不同的两者一旦遇见就同归于尽,最后活下来的值都是相同的,即要求的结果
        //时间O(n),空间O(1)
        int count = 0;
        int card = 0;
        for(int num:nums){
            if(count == 0) card = num;
            count += (card == num)?1:-1;
        }
        return card;
    }
}

你可能感兴趣的:(Leetcode)