首页 > 编程语言 >代码随想录算法训练营第27天 | 39. 组合总和 、 40.组合总和II 、 131.分割回文串

代码随想录算法训练营第27天 | 39. 组合总和 、 40.组合总和II 、 131.分割回文串

时间:2024-06-03 23:55:03浏览次数:12  
标签:return target 组合 const sum 随想录 candidates path 总和

  1. 组合总和

本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制
题目链接/文章讲解:https://programmercarl.com/0039.组合总和.html
视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function(candidates, target) {
    candidates.sort((a,b)=>a-b);
    const res = [];
    const path = [];
    let sum = 0;
    let len = candidates.length;
    const backtracking = (startIndex) => {
        if (sum === target) {
            res.push([...path]);
            return;
        }

        for (let i=startIndex;i<len;i++) {
            sum += candidates[i];
            path.push(candidates[i]);
            if (sum > target) {
                sum -= candidates[i];
                path.pop();
                return;
            }
            backtracking(i);
            sum -= candidates[i];
            path.pop();
        }
    }
    backtracking(0);
    return res;
};

40.组合总和II

本题开始涉及到一个问题了:去重。
注意题目中给我们 集合是有重复元素的,那么求出来的 组合有可能重复,但题目要求不能有重复组合。
题目链接/文章讲解:https://programmercarl.com/0040.组合总和II.html
视频讲解:https://www.bilibili.com/video/BV12V4y1V73A

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum2 = function(candidates, target) {
    candidates.sort((a,b)=>a-b);
    let len = candidates.length;
    const res = [];
    const set = new Set();
    const path = [];
    const backtracking = (startIndex, sum) =>{
        if (sum === target) {
            res.push([...path]);
            return;
        }
        for (let i=startIndex; i< len;i++) {
            if (i>startIndex && candidates[i] === candidates[i-1]) {
                continue;
            }
            let item = candidates[i];
            sum += item;
            if (sum > target) {
                sum -= item;
                return;
            }
            path.push(item);
            backtracking(i+1,sum);
            path.pop();
            sum -= item;
        }
    }
    backtracking(0,0);
    return res;
};

131.分割回文串

本题较难,大家先看视频来理解 分割问题,明天还会有一道分割问题,先打打基础。
https://programmercarl.com/0131.分割回文串.html
视频讲解:https://www.bilibili.com/video/BV1c54y1e7k6

function isPalindrome(s, start, end) {
    for (let i=start,j=end;i<=end;i++) {
        if (s[i]!==s[j]) {
            return false;
        }
        j--;
    }
    return true;
}

/**
 * @param {string} s
 * @return {string[][]}
 */
var partition = function(s) {
    let res = [];
    let path = [];
    const backtraversing = (str,startIndex)=>{
        if (str.length<=startIndex){
            res.push([...path]);
            return;
        }

        for (let i=startIndex;i<str.length;i++) {
            if (isPalindrome(str,startIndex,i)) {
                path.push(str.slice(startIndex,i+1));
                backtraversing(str,i+1);
                path.pop();
            } else {
                continue;
            }
        }
    }
    backtraversing(s,0);
    return res;
};

标签:return,target,组合,const,sum,随想录,candidates,path,总和
From: https://www.cnblogs.com/yuanyf6/p/18229937

相关文章

  • 代码随想录算法训练营day13(栈与队列)
    代码随想录算法训练营day:学习内容:今天主要学习队列239347学习产出:239一开始想着直接暴力遍历,但是时间复杂度为nk。采用deque实现一个单调队列,因为我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最......
  • 代码随想录算法训练营第二十三天 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索
    669.修剪二叉搜索树题目链接文章讲解视频讲解classSolution{public:TreeNode*trimBST(TreeNode*root,intlow,inthigh){if(root==nullptr)returnnullptr;//当前值小于左边界时,当前节点的左子树全部小于左边界,所以全部删除,直接处理右子树......
  • leetcode 377. 组合总和 Ⅳ(dp)
    377.组合总和Ⅳ-力扣(LeetCode)dp,跟完全背包反着来,可以当作是爬楼梯来做,相当于每次爬的楼梯数是从数组种选的。1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebug(x)cout<<#x<<"is"<<x<<endl;3#include<bits/stdc++.h>4usin......
  • Python基础-- 组合类型
    Python基础--组合类型Python基础--组合类型Python基础--组合类型(一)列表的特征(二)列表的创建(三)列表的访问(四)列表的操作方法(五)列表支持的运算符二、元组(一)元组特征和基本概念(一)元组和列表的对比三、字典(一)字典的特征(二)字典元素的访问(三)字典的操作......
  • 代码随想录算法训练营第二十二天 | 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的
    235.二叉搜索树的最近公共祖先题目链接文章讲解视频讲解思路:递归遍历二叉搜索树   如果当前值大于p和q的值,向左遍历   如果当前值小于p和q的值,向右遍历   否则说明当前值介于p和q之间,直接返回当前节点classSolution{public:TreeNode*lowestCommonAnc......
  • 代码随想录算法训练营Day59 | 503.下一个更大元素II、42. 接雨水 | Python | 个人记录
    注:Day58是休息日。本文目录503.下一个更大元素II做题看文章42.接雨水做题看文章以往忽略的知识点小结个人体会503.下一个更大元素II代码随想录:503.下一个更大元素IILeetcode:503.下一个更大元素II做题和之前的739.每日温度一样,只不过可以循环,我这边是多遍历一......
  • LeetCode 1151. 最少交换次数来组合所有的 1
    1151.最少交换次数来组合所有的1给出一个二进制数组 data,你需要通过交换位置,将数组中 任何位置 上的1组合到一起,并返回所有可能中所需 最少的交换次数。示例1:输入:data=[1,0,1,0,1]输出:1解释:有三种可能的方法可以把所有的1组合在一起:[1,1,1,0,0],交换......
  • 代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众
    530.二叉搜索树的最小绝对差题目链接文章讲解视频讲解关键词:二叉搜索树-->中序遍历关于递归的返回值  由于需要遍历整棵二叉树,所以返回值为void,如果不是遍历整棵二叉树,需要在得到结果时立即返回结果,此时返回值才不为空怎样使用两个指针pre和cur使得pre始终指向cur的前......
  • 代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 二叉搜索树
    654.最大二叉树题目链接文章讲解视频讲解classSolution{public:TreeNode*constructMaximumBinaryTree(vector<int>&nums){returninorderTraversal(nums,0,nums.size()-1);}TreeNode*inorderTraversal(vector<int>&nums,intbegi......
  • Day 9:2829. k-avoiding 数组的最小总和
    Leetcode2829.k-avoiding数组的最小总和给你两个整数n和k。对于一个由不同正整数组成的数组,如果其中不存在任何求和等于k的不同元素对,则称其为k-avoiding数组。返回长度为n的k-avoiding数组的可能的最小总和。n个不同正整数的最小总和,那就是从1......