2024.3.6
- 题目来源
- 我的题解
- 方法一 枚举遍历
- 方法二 枚举遍历(优化)
题目来源
力扣每日一题;题序:2917
我的题解
方法一 枚举遍历
使用一个数组存储每一个比特位为1的数量,然后根据该数组得到结果的每一比特位是否为1。
时间复杂度:O(nlogC)。n是nums的长度,C等于32
空间复杂度:O( C)
public int findKOr(int[] nums, int k) {int[] count=new int[32];for(int i=0;i<nums.length;i++){countBit(count,nums[i]);}int res=0;for(int i=0;i<32;i++){if(count[i]>=k)count[i]=1;elsecount[i]=0;res+=count[i]*(int)Math.pow(2,i);}return res;
}
public void countBit(int[] count,int num){int bit=num&1;if(bit==1)count[0]++;for(int i=0;i<31;i++){num=num>>1;bit=num&1;if(bit==1)count[i+1]++;}
}
方法二 枚举遍历(优化)
不使用显式数组去存储
时间复杂度:O(nlogC)
空间复杂度:O(1)
public int findKOr(int[] nums, int k) {int res=0;for(int i=0;i<31;i++){int t=0;for(int num:nums){if(((num>>i)&1)!=0){t++;}}if(t>=k)res|=1<<i;}return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~