代码随想录Day23 | LC 39, 40, 131

39. Combination Sum
题目:
Given an array of distinct integers candidates and a target integer target, return a list of all unique combinations of candidates where the chosen numbers sum to target. You may return the combinations in any order.

The same number may be chosen from candidates an unlimited number of times. Two combinations are unique if the frequency of at least one of the chosen numbers is different.

The test cases are generated such that the number of unique combinations that sum up to target is less than 150 combinations for the given input.

class Solution {
public:
    vector<vector<int>>res;
    void permutate(vector<int>&nums, int sum, int idx, int target, vector<int>num) {
        if (sum >= target) {
            if (sum == target) {
                res.push_back(num);
            }
            return;
        }
        // 剪枝
        for (int i = idx; i < nums.size() && sum + nums[i] <= target; i++) {
            num.push_back(nums[i]);
            permutate(nums, sum + nums[i], i, target, num);
            num.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<int>num;
        // 需要排序
        sort(candidates.begin(), candidates.end()); 
        permutate(candidates, 0, 0, target, num);
        return res;
    }
};

40. Combination Sum II

思路:和39题的区别是有重复的数字,但是不可以有重复的位置
同一树层不可以重复,同一树枝可以重复

class Solution {
public:
    set<vector<int>>res;
    void permutate(vector<int>&nums, int sum, int idx, int target, vector<int>num) {
        if (sum >= target || idx >= nums.size()) {
            if (sum == target) {
                res.insert(num);
            }
            return;
        }
        for (int i = idx; i < nums.size() && sum + nums[i] <= target; i++) {
        	// 同一个位置不选一样的数字 
            if (i > idx && nums[i] == nums[i - 1]) {
                continue;
            }
            num.push_back(nums[i]);
            permutate(nums, sum + nums[i], i + 1, target, num);
            num.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<int>num;
        sort(candidates.begin(), candidates.end()); 
        permutate(candidates, 0, 0, target, num);
        return vector<vector<int>>(res.begin(), res.end());
    }
};

131. Palindrome Partitioning

题目:Given a string s, partition s such that every substring of the partition is a palindrome. Return all possible palindrome partitioning of s.

优化:将所有可能的substring是否为回文串提前算好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值