public int majorityElement(int[] nums) {
int ret=0;
for(int i=0;i<32;i++){
int ones=0,zeros=0;
for(int j=0;j<nums.length;j++){
if((nums[j]&(1<<i))!=0){
++ones;
}
else
++zeros;
}
if(ones>zeros)
ret=ret|(1<<i);
}
return ret;
}
}
用位操作数解题 ,因为一个整数在32位机器上可以被表示为长度为32位的数组 输入该数组以计算该整数有0以及1的个数
((nums[j]&(1<<i))!=0) 这个函数 我刚开始不是很理解 后面查了才懂 是nums[j]索引位置的与上i左移1位 意思是看nums索引j位置这个整数位置i是否为1
method 2 排序
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
先用java类库中自带 的Arrays.sort对数组中排序 有序数组中一半的数字值就是答案
时间复杂度O(n*logn)
空间复杂度O(1)
method 3
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> mymap=new HashMap<>();
int ret=0;
for(int num:nums){
if(!mymap.containsKey(num))
mymap.put(num,1);
else
mymap.put(num,mymap.get(num)+1);
if(mymap.get(num)>nums.length/2){
ret=num;
break;
}
}
return ret;
}
}
这个方法是我刚开始就想到的,但是自己从来没有用map做过题 所以连创建map都不会。。也是十分尴尬,也侧面反映出自己coding能力和基础 的不足,要更多更多的打码,
首先用创建一个map 因为map的特性是key只允许一个值出现一次 所以可以用作记录nums的值 然后value用作记录nums出现的次数,并且用java7新增的foreach方法遍历整个数组,同时 如果map中不包含正在遍历 的这个值 就用put加1 在map中放入这个key 否则,则用put再放一次,put的特性是覆盖原来这个key原本的值,不太了解 后面查书才知道,在value值上调用get 调取正在遍历的key num的值 并且把它加1 然后重新放入到map中
题目中提到有一半的数组元素都是要找的答案 所以 如果num中已经存在大于nums长度一半的值时,把结果赋值给ret 打破循环