leetcode 494. 目标和(n个数每个数取+或者- 相加=sum的情况 sum不大时dp 否则折半枚举)

这篇博客讲述了作者在处理一道编程题目时遇到的问题,涉及数组处理、二分枚举和动态规划。在代码实现过程中,由于对数组开大小的错误估计,导致在N=1时出现异常。作者通过特判解决该问题,并分享了代码调试的心得,强调了细致思考和合理初始化的重要性。
摘要由CSDN通过智能技术生成

题目
我真的好烦啊!!!我这么瘦弱 风还肆无惮忌的吹我,都感冒了,一整天天昏昏沉沉。
我不想下标从0开始,好烦啊好烦啊,一道傻逼代码调了一下午我真是醉了。现在脑子还很懵。

在这里插入图片描述

  1. 假如n个数,对于折半枚举后的答案存放在b,b数组里,按说开[(1<<(N/2+1))+1]就够了,所以我就随便开了,[1<<N],但是N=1的时候尴尬了。。。。
  2. 下面代码: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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值