leetcode刷题规律

回溯法

1.求数组排列组合

题目特征: 要求一个组合的vector<vector < T > > 合集。此时需要用回溯法求出所有的可能的集合。
题目列表
39.组合数组
电话号码的字母组合
组合总和 II
组合
组合总和 III
因子的组合
组合总和 Ⅳ
技巧
(1)有些题目需要先对数组进行一个排序,然后再元素的选择过程中,要注意是否可以重复选择。
(2)如果对结果的集合要求每种结果里的元素不能重复,则需要设置一个begin位置,代表元素其实搜索的位置,每次从begin开始搜索;对于不可以重复选择的,在递归的时候要把起始位置设置为i+1;如果允许重复使用,则起始位置为i
(3)如果结果的集合里,相同元素的不同顺序视为不同,则可以不设置begin
(4)有些数组里有重复元素,有些没有重复元素。对有重复元素的需要根据题意做一些处理。

DP算法

对dp问题和回溯法的区别之一就是是否需要列出所有的排列组合。如果不需要排列组合只要得到是否能达到target/达到target的有几种等问题,则需要用dp求解。一般dfs会超时。

1.背包问题

背包问题题解
受此启发整理一下背包问题的思路。
背包问题特征:需要从数组nums里,选择几个元素,得到target。可以重复选是完全背包,不可以是0-1背包
(1)377.组合总和:正整数、不重复数组,求和为目标的组合数。
完全背包需要考虑元素之间的顺序,顺序不同视为不同组合外循环容量,内循环遍历元素
dp[i]代表容量为i有几种组合
dp[i]=dp[i-nums0]+dp[i-nums1]+…
理解:所有组合,最后一个元素都是由数组中元素组成,所以把它摘出来,则所有的方案就是他们被减去后的方案数相加。

(2)494目标和:非负整数数组,目标和s,要求所有数用上,前面加+或者-,得到目标和的方案数。
正数集合x,负数集合y,则x+y=sum,x-y=s,则x=(sum+s)/2,且(sum+s)不能是奇数,奇数则代表不能有组合
转化为0-1背包,从数组中选几个数能凑成x、外循环数组、内循环容量,且使用滚动数组时,内循环需要从后向前更新,否则会覆盖上一层的数据。
第i个元素,选择拿或者不拿:
dp[i][j]代表前i个元素,得到和为j的方案数,则dp[i][j]=dp[i-1][j]+dp[i-1][j-numi].

(3)有零钱和目标,求拿到目标有几种方案
完全背包、外循环数组、内循环目标和,内循环从后向前
dp[i][j]代表前i个币,容量为j有几种方案,则dp[i][j]=dp[i-1][j]+dp[i-1][j-coin]+dp[i-1][j-2*coin]+…(不用、用一个、两个…

(4)单词拆分:字符串拆分,能否拆成字典里单词的个数
完全背包、从数组中拿元素,可以重复拿,能否将背包填满。外循环是容量,内循环是子字符串

dp[i]代表容量为i背包是否能被填满。dp[i]=dp[i-numsi],如果某个单词可以将前i个字母组成的字符串拆分,那么它能否被填满只与dp[i-numsi]有关了。并且一旦dp[i]=1,则可以停止搜索

(5)分割等和子集:正整数数组,分割为两个和相等的子集则转换为0-1背包,能否拿一半和的容量
dp[i][j]代表前i个元素拿j容量是否可以,那么dp[i][j]=dp[i-1][j]||dp[i-1][j-numi] 意思是拿或者不拿第i个元素,只要有一个为真则为真

0-1背包,外循环数组,内循环容量

(6)474. 一和零:m个0和n个1,能组成数组中元素的最大个数
因为m个0和n个1只能用一次,因此是0-1背包,两个背包背包容量分别为m和n,因此要建一个二维数组保存他们,dp[m][n]代表m个0和n个1能组成的最大个数
0-1背包、外循环遍历数组,内循环遍历容量

内循环需要双重循环,分别是循环0和1的数量,dp[m][n]=max(dp[m][n],dp[m-count0][n-count1]+1)

(7)322. 零钱兑换
不同金额的数组和一个目标值,判断最少需要的金币数。
完全背包,外循环容量,内循环数组
dp[i]代表容量为i时,最少需要的笔数量,dp[i]=min(dp[i],dp[i-x]+1),x为币的面值

attention:
1.一般dp数组会比容量的大小多1,因此在根据i遍历dp求dp[i]的时候,如果需要访问原数组nums,则对应的下标应该为nums[i-1]
2.内外循环需要注意 当遍历数组的时候一般无顺序要求,遍历容量时有要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值