面试题17.10主要元素。2星

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-majority-element-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:
初次写的解答,效率极低

class Solution {
    public int majorityElement(int[] nums) {
           int count = 0;
        for(int i=0;i<nums.length;i++){ 
            count = 0;
            for(int j = 0;j<nums.length;j++){
                if(nums[i] == nums[j]){
                    count++;
                }
            }
            if(count*2>=nums.length) return nums[i];
        }
        return -1;
    }
}

嵌套双层循环寻找,依次寻找如果一个数出现的次数超过半数,则将其返回。

方法二:
学习大神的解法,效率极高

class Solution {
    public int majorityElement(int[] nums) 
    {
        if (nums.length == 0)
        {
            return -1;
        }//数组长度为零则无结果,返回-1
        if (nums.length == 1)
        {
            return nums[0];
        }//长度为1,直接是主要元素
        int number = 0;//统计now出现个数
        int now = nums[0];
        for (int num : nums)//循环遍历该数组
        {
            if (num == now)
            {
                number++;
            }//如果和now相同则数量加一
            else
            {
                number--;
            }//如果和now不同则数量减一
            if (number < 0)
            {
                number = 0;
                now = num;
            }//如果数变为零,则让now变为当前和now不同的数

        }
        number = 0;
        for (int num : nums)
        {
            if (num == now)
            {
                number++;
            }

        }//当前计数最多的数为now,计算now的数量
        return number > nums.length / 2 ? now : -1;//如果数量大于数组数量的一半,就返回now,否则返回-1
        
    }
}

//一种抵消的思想,赞
作者:wo-zai-shang-tang-he-bian
链接:https://leetcode-cn.com/problems/find-majority-element-lcci/solution/di-xiao-de-si-xiang-by-wo-zai-shang-tang-he-bian/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java中的位运算符:
“>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;”
“>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。”

补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。
已知一个数的补码,求原码的操作其实就是对该补码再求补码。

发布了18 篇原创文章 · 获赞 0 · 访问量 326

猜你喜欢

转载自blog.csdn.net/qq_44787671/article/details/104508129
今日推荐