思路:
递归指数型枚举,然后判断每一种方案的异或和 相加即可。
const int N = 110;
bool st[N];
class Solution {
public:
int res=0;
int n=0;
void dfs(int u,int sum,vector<int>& num){
if(u==n){
int temp=0;
for(int i=0;i<n;i++){
if((sum>>i)&1){
temp=temp^num[i];
}
}
res+=temp;
return;
}
dfs(u+1,sum,num);
dfs(u+1,sum+(1<<u),num);
}
int subsetXORSum(vector<int>& nums) {
n=nums.size();
dfs(0,0,nums);
return res;
}
};
思路:
模拟即可
枚举两种可能的结果1010… or 0101…
判断那个方案少
判断过程中应注意模式串(第二行的字符串)与测试样例的串中1和0的个数必须相同,如果最后都不匹配就是无解。
class Solution {
public:
int minSwaps(string s) {
int a=0;
int b=0;
for(int i=0;i<s.size();i++){
if(s[i]=='1') a++;
else b++;
}
char start1='1';
char start2='0';
int res=0x3f3f3f3f;
if(1==0) return -1;
else{
int cnt1=0;
int cnt0=0;
int cnt=0;
for(int i=0;i<s.size();i++){
if(start1=='1') cnt1++;
if(start1=='0') cnt0++;
if(s[i]!=start1){
cnt++;
}
start1^=1;
}
if(cnt1==a&&cnt0==b) res=min(res,cnt/2);
cnt1=cnt0=cnt=0;
for(int i=0;i<s.size();i++){
if(start2=='1') cnt1++;
if(start2=='0') cnt0++;
if(s[i]!=start2){
cnt++;
}
start2^=1;
}
if(cnt1==a&&cnt0==b) res=min(res,cnt/2);
}
if(res==0x3f3f3f3f) res=-1;
return res;
}
};
思路:
暴力枚举第一个数组,第二个数组不能再暴力了 会超时,可以使用hash表用unordered_map时间复杂度可以达到线性的,如果将nums2数组某个数+val 对应hash表的操作就是将原有的数个数-- 更新后的个数++。
class FindSumPairs {
public:
vector<int> num1;
vector<int> num2;
unordered_map<int,int> h;
FindSumPairs(vector<int>& nums1, vector<int>& nums2) {
num1=nums1;
num2=nums2;
for(auto x:num2){
h[x]++;
}
}
void add(int index, int val) {
h[num2[index]]--;
num2[index]+=val;
h[num2[index]]++;
// for(auto x:num2){
// cout<<x<<" ";
// }
// cout<<endl;
}
int count(int tot) {
int res=0;
for(int i=0;i<num1.size();i++){
res+=h[tot-num1[i]];
}
return res;
}
};
/**
* Your FindSumPairs object will be instantiated and called as such:
* FindSumPairs* obj = new FindSumPairs(nums1, nums2);
* obj->add(index,val);
* int param_2 = obj->count(tot);
*/
思路:
第一类斯特林数
模板题
const int N = 1010,mod=1e9+7;
int f[N][N];
class Solution {
public:
int rearrangeSticks(int n, int k) {
f[0][0]=1;
for(int i=1;i<N;i++){
for(int j=1;j<=k;j++){
f[i][j]=(f[i-1][j-1]+(long long)(i-1)*f[i-1][j])%mod;
}
}
return f[n][k];
}
};