【set存储:去重+排序】4sum

从给定的数组中找到4个数的组合,和==target。组合不能重复,按非递减顺序。

大致思路:

要或不要,dfs。但是AC代码(别人的题解)里的剪枝很棒,结合了“按非递减顺序——递增顺序”的题意。

另外,对于重复的问题,使用的是set来对vector<int>型的变量去重(比去find那种要快,而且不需要对结果重新排序

AC代码:


class Solution {
    int N = 4;
public:
     
    // 使用DFS的思想来完成
    vector<vector<int> > fourSum(vector<int> &num, int target=0) {
         
        vector<vector<int>> result;
        set<vector<int>> res;
 
        vector<int> vi;
 
        sort(num.begin(), num.end());        
        dfs(res, vi, num, target, 0, 0);
        // sort(result.begin(), result.end());
        // result.erase(unique(result.begin(),result.end()),result.end());
 
        for(auto a:res){
            result.push_back(a); //最后把set的东西复制到结果的类型里去
        }
 
        return result;
         
    }
 
    void dfs(set<vector<int>> &res,  vector<int> &vi, vector<int> &num,  int target, int start, int cnt) {
 
        if(cnt==N){            
            if(target==0){
                res.insert(vi);                
            }           
            return;
        }
 
        // 选择一个开始位置
        for(int i=start;i<num.size();++i){
 
            // cnt表示已经累加的数, 加上当前数的话, 还有n-cnt-1个数
            // 所需要的是target-num[i], 这个数一定要大于(N-cnt-1)*num[i])才行!!!!
            if(target-num[i]<(N-cnt-1)*num[i]){
                break;
            }
 
            // 选择了某条通路
            vi.push_back(num[i]);
            // 在该通路上继续前行
            dfs(res,vi, num, target-num[i] , i+1, cnt+1);
            // 恢复现场, 走完了某条通路, 需要恢复现场
            vi.pop_back();
        }
         
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值