题目
我真的好烦啊!!!我这么瘦弱 风还肆无惮忌的吹我,都感冒了,一整天天昏昏沉沉。
我不想下标从0开始,好烦啊好烦啊,一道傻逼代码调了一下午我真是醉了。现在脑子还很懵。
- 假如n个数,对于折半枚举后的答案存放在b,b数组里,按说开[(1<<(N/2+1))+1]就够了,所以我就随便开了,[1<<N],但是N=1的时候尴尬了。。。。
- 下面代码:n=1时:p=-1,dfs(0,nums,0),显然是不行的。
int n=nums.size();
a=new ll[1<<n],b=new ll[1<<n],tot1=tot2=0;
if(n==0) return 0;
if(n==1) return (nums[0]==S)+(nums[0]==-S);
p=n/2-1,dfs(0,nums,0);
p=n-1,dfs(n/2,nums,0);
懒得改有关p的代码了了,直接n=1特判,气死了;
class Solution {
#define ll long long
public:
int p,tot1,tot2;
ll *a,*b;
void dfs(int pos,vector<int>&vec,ll sum){
if(pos==p+1){
if(p==vec.size()/2-1) a[++tot1]=sum;
else b[++tot2]=sum;
return;
}
dfs(pos+1,vec,sum+vec[pos]);
dfs(pos+1,vec,sum-vec[pos]);
}
int findTargetSumWays(vector<int>& nums, int S) {
int n=nums.size();
a=new ll[1<<n],b=new ll[1<<n],tot1=tot2=0;
if(n==0) return 0;
if(n==1) return (nums[0]==S)+(nums[0]==-S);
p=n/2-1,dfs(0,nums,0);
p=n-1,dfs(n/2,nums,0);
sort(a+1,a+tot1+1),sort(b+1,b+tot2+1);
int ans=0;
for(int i=1;i<=tot1;++i){
int l=lower_bound(b+1,b+tot2+1,(ll)S-a[i])-b,r=upper_bound(b+1,b+tot2+1,(ll)S-a[i])-b;
if(l==tot2+1) continue;
ans+=r-l;
}
return ans;
}
};