LeetCode小算法记录(五十九)主要元素

如果数组中多一半的数都是同一个,则称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-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
package leetCodeTest;

import java.util.Arrays;

public class 主要元素 {
    public static void main(String[] args) {
        int[] nums = new int[]{1,2,5,9,5,9,5,5,5};
        int i = majorityElement(nums);
        System.out.println("i = " + i);
    }

    /**
     *
     * 首先对原数组排序让相同元素都处于紧凑状态。
     * 使用sum数组存储每一个元素从下标0-i(i为当前遍历数组的下标)之间出现的次数。
     * 在存储sum数组的同时,将sum数组中的最大值count取出,并记录当sum为最大的时候的下标flag,
     * 最后判断当前count是否大于nums数组的一半,如果大于nums数组的一半,
     * 就返回nums中下标为flag的值,否则返回-1.
     * @param nums
     * @return
     */
    public static int majorityElement(int[] nums) {
        if (nums.length == 0)
            return -1;
        if (nums.length == 1)
            return nums[0];
        Arrays.sort(nums);//对原数组进行排序
        int i,temp = Integer.MAX_VALUE,count = Integer.MIN_VALUE,flag = 0;
        int[] sum = new int[nums.length];//总和数组
        for (i=0;i<nums.length;i++){
            //使用temp判断当前元素与上一个元素是否相同,如果不同就重新计数
            if (temp != nums[i]){
                sum[i] = 1;
                temp = nums[i];
            }else {
                sum[i] = sum[i-1] + 1;
            }
            //如果当前的sum值大于count就替换count,并记录下标到flag
            if (sum[i] > count){
                count = sum[i];
                flag = i;
            }
        }
        //如果count大于nums数组的一半就返回nums[flag]
        return count>nums.length/2 ? nums[flag]:-1;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值