摘要:
组合是无序的,满足方案要求即可,对应不同的题意,有时候元素可以重复,有时候不能重复。 排列是有序的,同一批元素可以有多种排列。 子集跟上面两种又不同,首先空集是子集,一个元素也是子集,数组本身也是子集的子集。 所以子集的求解更复杂。 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组 阅读全文
摘要:
跟组合类似,排列也是穷举所有可行解,区别在于排列是有序的,同一个组合可以有多种排列。 比如对组合来说[1,2,3]和[3,2,1]是同一个,但对于排列而言,就是两个。 案例1:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 1.如何避免排列中的重复 阅读全文
摘要:
组合问题也是需要进行穷举的,使用回溯算法正合适。 案例1: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candi 阅读全文
摘要:
在二维数组进行单词搜索也是经典的需要采用回溯算法的问题。 案例1: 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水 阅读全文
摘要:
回溯算法其实就是暴力穷举算法,只不过暴力穷举采用了先拆解子问题,然后将子问题使用递归的方式进行求解,并且在不满足条件的情况下,有向上回溯的过程。 许多复杂的,规模较大的问题都可以使用回溯法。 回溯问题看起来比较复杂,但一般都有固定的套路。 据我个人的理解,回溯过程中需要明确以下几个问题 1.什么是合 阅读全文
摘要:
零钱兑换也是动态规划的典型问题,一般是给你几种零钱,数量不限,给一个amount,问共有多少种兑零钱的方法。 我们看一个案例 案例1: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬 阅读全文
摘要:
回文串是从左到右和从右到左读起来一样的字符串,变种还有回文子序列,区别就是字符可以不连续。 求回文串个数、最长回文串、最长回文序列也是典型的二维动态规划问题。 我们通过几个简单的案例看一下这些题目的规律。 案例1:给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不 阅读全文
摘要:
公共子序列是二维动态规划的典型问题,一般用了求两个字符串的相似程度。 我们看一个案例: 案例1:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串中的字符构成,这 阅读全文
摘要:
子序列是序列的一部分,元素可以不连续。 子串是字符串的一部分,必须连续。 求子序列的和、连续递增子序列都是经典的一维动态规划问题。 这一类题目都有差不多的思路,我们看案例。 案例1:有一个整数数组 nums ,请你找出一个具有最大和的连续子数组,返回其最大和。子数组是数组中的一个连续部分。 我们假设 阅读全文
摘要:
编辑距离也是动态规划的经典题目,通常需要计算从一个字符串通过一系列操作变成另一个字符串需要的最小步数。 或用来查看两个字符串的相似程度。 我们从一个简单的题目来看: 1.有两个单词 word1 和 word2 ,每步可以删除任意一个字符串中的一个字符。请计算使得 word1 和 word2 相同所需 阅读全文
摘要:
动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素的穷举解法。 动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。 使用动态规划 阅读全文