#问题:如果数组中多一半的数都是同一个,则称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-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)。
已知一个数的补码,求原码的操作其实就是对该补码再求补码。