剑指 Offer 39. 数组中出现次数超过一半的数字
class Solution {
public int majorityElement(int[] nums) {
if(nums.length==1) return nums[0];
Arrays.sort(nums);
int n=nums.length;
int res=nums[0];
// 2 3 3
for(int i=0;i<=n/2;i++){
if(i+n/2<n-1&&nums[i]==nums[i+n/2]){
res=nums[i];
break;
}
if(i+n/2>=n-1){
res=nums[n-1];
break;
}
}
return res;
}
}
方法二:哈希表
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer,Integer> map=new HashMap<>();
int res=nums[0];
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
if(map.get(nums[i])>nums.length/2){
res=nums[i];
break;
}
}
return res;
}
}
三:摩尔投票法
class Solution {
public int majorityElement(int[] nums) {
//摩尔投票法
int count=0;
int zs=0;
for(int i=0;i<nums.length;i++){
if(count==0) zs=nums[i];
count+= nums[i]==zs ? 1 : -1;
}
return zs;
}
}
剑指 Offer 66. 构建乘积数组
class Solution {
public int[] constructArr(int[] a) {
int[] b=new int[a.length];
int temp=1;
//两次遍历a数组,分别求i 左侧、右侧的乘积和
for(int i=0;i<a.length;i++){
if(i-1>=0){
temp*=a[i-1];
}
b[i]=temp;
}
temp=1;
for(int i=a.length-1;i>=0;i--){
if(i+1<=a.length-1){
temp*=a[i+1];
}
b[i]*=temp;
}
return b;
}
}