文章目录
1680. 连接连续二进制数字M 进制转换
其实题目没有很难,但是有点进制转换的意味在里面。在每次的拼接过程中,我们需要注意把原结果乘多少倍。如果在后面拼接了111
,其实需要把之前的内容乘8倍。再加上当前的数字。
class Solution {
public int concatenatedBinary(int n) {
int mod = 1000000007;
long ans = 0;
for (int i = 1; i<=n;i++){
String s = Integer.toBinaryString(i);
int len = s.length();
ans = ans*(1<<len)+i;
ans = ans % mod;
}
return (int)ans;
}
}
1681. 最小不兼容性H 状态压缩,枚举子集
核心知识点:枚举子集。对于二进制的1011101
可以通过for (int j = i; j>0; j = (j-1)&i)
的方法枚举i的全部子集。这样的复杂度是 O ( 3 n ) O(3^n) O(3n).
class Solution {
public int minimumIncompatibility(int[] nums, int k) {
// 思路:状态压缩+子集枚举
Arrays.sort(nums);
int n = nums.length;
int m = n/k;
int N = 1<<n;
int[] g = new int[1<<n];
// 首先我们需要得到每种m个元素的区间上的最小不兼容
for( int i = 0; i<N;i++){
g[i] = -1; // -1表示不合法,不合法情况:1.不是m个 2.m个但是有重复的
if (count(i) == m){
int index = 0;
int max = 0;
int min = 16;