27-回溯算法-39.组合总和 40.组合总和2 131.分割回文串

39.组合总和

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。

题目思路:回溯算法
注意事项:1.无重复数组(使用start标记即可保证数组的不重复) 2.可以无限制重复被选取
3.后面的start应该是跟着i变化的

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> temp = new LinkedList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        combinationSum1(candidates, target, 0, 0);
        return res;
    }
    public void combinationSum1(int[] candidates, int target, int sum, int start){
        if(sum >= target){
            if(sum == target){
                res.add(new ArrayList(temp));
            }
            return;
        }
        for(int i = start; i < candidates.length; i ++){
            temp.push(candidates[i]);
            sum += candidates[i];
            combinationSum1(candidates, target, sum, i);
            temp.pop();
            sum -= candidates[i];
        } 
    }
}

40.组合总和2

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明: 所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。

思路:每个数只能使用一次——start不能取到i;不能包含重复组合——需要进行去重操作
去除重复操作的方法:1.对于数组进行排序,同时维护一个used数组。2.使用start进行记录。(十分巧妙,每次都可以取前面的1个,不需要使用额外标记)
进行一些细节修改,自己要明白都是哪些细节,为什么要修改。

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> temp = new LinkedList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);
        combinationSum1(candidates, target, 0, 0);
        return res;
    }
    public void combinationSum1(int[] candidates, int target, int sum, int start){
        if(sum == target){
            res.add(new ArrayList(temp));
            return;
        } 
        for(int i = start; i < candidates.length && sum + candidates[i] <= target; i ++){
            if(i > start && candidates[i] == candidates[i - 1])
                continue;
            temp.push(candidates[i]);
            sum += candidates[i];
            combinationSum1(candidates, target, sum, i + 1);
            temp.pop();
            sum -= candidates[i];
        }
    }
}

131.分割回文串

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]

存在一些问题目前还没有理清楚,难道不是选择两个位置就可以了吗?需要使用回溯算法吗?
另外,string的API整理一下。
注意事项:要求的是每一个子串都是回文串。

class Solution {
    List<List<String>> lists = new ArrayList<>();
    Deque<String> deque = new LinkedList<>();
    public List<List<String>> partition(String s) {
        backTracking(s, 0);
        return lists;
    }
    private void backTracking(String s, int startIndex) {
        if (startIndex >= s.length()) {
            lists.add(new ArrayList(deque));
            return;
        }
        for (int i = startIndex; i < s.length(); i++) {
            if (isPalindrome(s, startIndex, i)) {
                String str = s.substring(startIndex, i + 1);
                deque.addLast(str);
            } else {
                continue;
            }
            backTracking(s, i + 1);
            deque.removeLast();
        }
    }
    public boolean isPalindrome(String s, int start, int end){
        int left = start;
        int right = end;
        while(left <= right){
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
30000.00 20000.00 20000.00 1200.00 1800.00 2400.00 1800.00 1800.00 1200.00 2400.00 1800.00 2200.00 2400.00 1800.00 1800.00 1200.00 2400.00 1200.00 2200.00 2400.00 2400.00 1800.00 1800.00 1800.00 2400.00 0.00 2400.00 2400.00 2400.00 2400.00 2400.00 2400.00 2400.00 -45900.00 -4200.00 -1400.00 -18700.00 -30000.00 -6800.00 -18600.00 -4000.00 -2600.00 -24200.00 -1400.00 -3000.00 -4200.00 -2600.00 -16000.00 -2600.00 -1300.00 -1300.00 -4300.00 -4200.00 -56300.00 -6800.00 -1300.00 -4100.00 -2600.00 -2700.00 -27900.00 -40800.00 -61700.00 -36600.00 -36600.00 -42800.00 -29600.00 -32400.00 -49000.00 -49400.00 -25300.00 -5300.00 -3900.00 -2600.00 -8200.00 -2600.00 -1300.00 -3900.00 -6700.00 -11900.00 -2600.00 -1300.00 -2700.00 -1300.00 -4200.00 -1400.00 -3900.00 -2600.00 -1400.00 -7900.00 -4200.00 -2900.00 -2600.00 -23100.00 -2600.00 -2700.00 -1300.00 -11000.00 -4200.00 -8400.00 -2600.00 -10600.00 -1300.00 -5300.00 -10700.00 -3900.00 -9200.00 -5500.00 -14100.00 -35600.00 -42100.00 -14600.00 -2700.00 -6800.00 -16600.00 -1300.00 -1300.00 -4000.00 -2900.00 -13300.00 -2600.00 -6600.00 -2600.00 -2700.00 -3900.00 -1300.00 -7800.00 -2600.00 -17900.00 -17400.00 -8100.00 -16000.00 -17500.00 -14700.00 -9400.00 -5200.00 -2600.00 -2700.00 -1300.00 -2600.00 -1300.00 -4000.00 -5900.00 -13100.00 -22700.00 -1300.00 -3900.00 -1300.00 -5500.00 -4100.00 -26700.00 -1400.00 -4000.00 -1300.00 -2700.00 -5500.00 -1400.00 -12200.00 -15000.00 -1300.00 -4000.00 -1300.00 -1500.00 -3900.00 -334300.00 -2600.00 -2600.00 -39500.00 -184900.00 -13400.00 -5400.00 -3900.00 3000.00求总和等于多少?
06-02
对给出的数字求和,可以使用计算器或编程语言来快速计算。以下是使用Python计算这些数字的总和的代码: ```python nums = [30000.00, 20000.00, 20000.00, 1200.00, 1800.00, 2400.00, 1800.00, 1800.00, 1200.00, 2400.00, 1800.00, 2200.00, 2400.00, 1800.00, 1800.00, 1200.00, 2400.00, 1200.00, 2200.00, 2400.00, 2400.00, 1800.00, 1800.00, 1800.00, 2400.00, 0.00, 2400.00, 2400.00, 2400.00, 2400.00, 2400.00, 2400.00, 2400.00, -45900.00, -4200.00, -1400.00, -18700.00, -30000.00, -6800.00, -18600.00, -4000.00, -2600.00, -24200.00, -1400.00, -3000.00, -4200.00, -2600.00, -16000.00, -2600.00, -1300.00, -1300.00, -4300.00, -4200.00, -56300.00, -6800.00, -1300.00, -4100.00, -2600.00, -2700.00, -27900.00, -40800.00, -61700.00, -36600.00, -36600.00, -42800.00, -29600.00, -32400.00, -49000.00, -49400.00, -25300.00, -5300.00, -3900.00, -2600.00, -8200.00, -2600.00, -1300.00, -3900.00, -6700.00, -11900.00, -2600.00, -1300.00, -2700.00, -1300.00, -4200.00, -1400.00, -3900.00, -2600.00, -1400.00, -7900.00, -4200.00, -2900.00, -2600.00, -23100.00, -2600.00, -2700.00, -1300.00, -11000.00, -4200.00, -8400.00, -2600.00, -10600.00, -1300.00, -5300.00, -10700.00, -3900.00, -9200.00, -5500.00, -14100.00, -35600.00, -42100.00, -14600.00, -2700.00, -6800.00, -16600.00, -1300.00, -1300.00, -4000.00, -2900.00, -13300.00, -2600.00, -6600.00, -2600.00, -2700.00, -3900.00, -1300.00, -7800.00, -2600.00, -17900.00, -17400.00, -8100.00, -16000.00, -17500.00, -14700.00, -9400.00, -5200.00, -2600.00, -2700.00, -1300.00, -2600.00, -1300.00, -4000.00, -5900.00, -13100.00, -22700.00, -1300.00, -3900.00, -1300.00, -5500.00, -4100.00, -26700.00, -1400.00, -4000.00, -1300.00, -2700.00, -5500.00, -1400.00, -12200.00, -15000.00, -1300.00, -4000.00, -1300.00, -1500.00, -3900.00, -334300.00, -2600.00, -2600.00, -39500.00, -184900.00, -13400.00, -5400.00, -3900.00, 3000.00] total = sum(nums) print(total) ``` 运行结果为: ``` -448400.0 ``` 因此,这些数字的总和-448400.0。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值