算法012:数组中的主要元素:数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

369 阅读1分钟
题目:
 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

 示例 1:
 输入:[1,2,5,9,5,9,5,5,5]
 输出:5

 示例 2:
 输入:[3,2]
 输出:-1

 示例 3:
 输入:[2,2,1,1,1,2,2]
 输出:2
 说明:
 你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?
		
思路:
使用投票算法,主要元素的对立面就是非主要元素,把它们看成一撮就可以了,就是肉搏法。

1.代码如下 MajorityElement.java:

package com.yuhl.right.leetcode;

/**
 * @author yuhl
 * @Date 2020/10/25 7:15
 * @Classname MianElement
 * @Description 主要元素
 * 数组中占比超过一半的元素称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
 *
 * 示例 1:
 * 输入:[1,2,5,9,5,9,5,5,5]
 * 输出:5
 *
 * 示例 2:
 * 输入:[3,2]
 * 输出:-1
 *
 * 示例 3:
 * 输入:[2,2,1,1,1,2,2]
 * 输出:2
 * 说明:
 * 你有办法在时间复杂度为 O(N),空间复杂度为 O(1) 内完成吗?
 */
public class MajorityElement {
    public static void main(String[] args) {
        int[] nums = {2, 2, 1, 1, 1, 2, 2};
        int res = majorityElement(nums);
        System.out.println(res);
    }
    public static int majorityElement(int[] nums) {
        // 投票算法
        int temp = nums[0];
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] == temp) {
                count++;
            } else {
                count--;
            }
            if (count == 0) {
                temp = nums[i];
                count = 1;
            }
        }

        // 验证是否满足要求
        int t = nums.length / 2 + 1;
        count = 0;
        for (int num : nums) {
            if (num == temp) count++;
            if (count == t) return temp;
        }
        return -1;
    }
}

2.执行结果:

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" 
2