1 |
|
二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的
1 | class Solution { |
1 |
|
二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的
1 | class Solution { |
1 | 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 |
1 |
|
参考文献
1 | 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 |
前言
作者在这里希望读者认真阅读前言部分。
本题是经典的NP 完全问题,也就是说,如果你发现了该问题的一个多项式算法,那么恭喜你证明出了 P=NP,可以期待一下图灵奖了。
正因如此,我们不应期望该问题有多项式时间复杂度的解法。我们能想到,例如基于贪心算法的「将数组降序排序后,依次将每个元素添加至当前元素和较小的子集中」之类的方法都是错误的,可以轻松地举出反例。因此,我们必须尝试非多项式时间复杂度的算法,例如时间复杂度与元素大小相关的动态规划。
方法一:动态规划
思路与算法
这道题可以换一种表述:给定一个只包含正整数的非空数组 nums[0],判断是否可以从数组中选出一些数字,使得这些数字的和等于整个数组的元素和的一半。因此这个问题可以转换成「0-1 背包问题」。这道题与传统的「0-1 背包问题」的区别在于,传统的「0-1 背包问题」要求选取的物品的重量之和不能超过背包的总容量,这道题则要求选取的数字的和恰好等于整个数组的元素和的一半。类似于传统的「0-1 背包问题」,可以使用动态规划求解。
在使用动态规划求解之前,首先需要进行以下判断。
1 | class Solution { |
1 | /** |
1 | 刚开始动态规划不太理解,后来发现: |
1 | /*而第0行非常容易求。dp[0][s] = true当且仅当nums[0]==s*/ |
1 |
|
1 | 优化版本: |
1 | //图解: |
1 | // d(i, s) : 是否存在:nums区间[0, i] 中取一些元素,使其和为s |
1 | 优化版本: |
1 | class Solution { |
1 | /*最后,这里给出最简的一维数组动态规划代码*/ |
1 | class Solution { |
参考文献
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum/solution/fen-ge-deng-he-zi-ji-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 |
剪绳子不需要大数计算
1 |
|
剪绳子Ⅱ 代码逻辑和I一样,只是把求最大值和求模写成大数的运算
1 | import java.math.BigInteger; |
参考文献
1 | 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。 |
1 | 示例 2: |
1 | 提示: |
1 | class Solution { |
参考文献
1 | 给定一个字符串 S,找出 S 中不同的非空回文子序列个数,并返回该数字与 10^9 + 7 的模。 |
1 | 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: |
我们可以定义两个子问题,分别对应最后一段上升和下降的波形子数组:
那么我们的子问题递推关系就变得清晰了起来:
1 | class Solution { |
1 |
|
参考文献
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
难度中等140收藏分享切换为英文接收动态反馈
当 A
的子数组 A[i], A[i+1], ..., A[j]
满足下列条件时,我们称其为湍流子数组:
i <= k < j
,当 k
为奇数时, A[k] > A[k+1]
,且当 k
为偶数时,A[k] < A[k+1]
;i <= k < j
,当 k
为偶数时,A[k] > A[k+1]
,且当 k
为奇数时, A[k] < A[k+1]
。也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
返回 A
的最大湍流子数组的长度。
示例 1:
1 | 输入:[9,4,2,10,7,8,8,1,9] |
示例 2:
1 | 输入:[4,8,12,16] |
示例 3:
1 | 输入:[100] |
提示:
1 <= A.length <= 40000
0 <= A[i] <= 10^9
我们可以定义两个子问题,分别对应最后一段上升和下降的波形子数组:
那么我们的子问题递推关系就变得清晰了起来:
1 | class Solution { |
1 | class Solution { |
1 |
|
参考文献
1 | 作者:nettee |
难度中等1459收藏分享切换为英文接收动态反馈
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
示例 1:
1 | 输入:nums = [10,9,2,5,3,7,101,18] |
示例 2:
1 | 输入:nums = [0,1,0,3,2,3] |
示例 3:
1 | 输入:nums = [7,7,7,7,7,7,7] |
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
进阶:
O(n2)
的解决方案吗?O(n log(n))
吗?1 | class Solution { |
1 | class Solution { |
参考文献作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 |
|
这道题和经典的背包问题很类似,不同的是在背包问题中,我们只有一种容量,而在这道题中,我们有 0 和 1 两种容量。每个物品(字符串)需要分别占用 0 和 1 的若干容量,并且所有物品的价值均为 1。因此我们可以使用二维的动态规划。
我们用 $dp(i, j)$ 表示使用 $i$ 个 $0$ 和 $j$ 个 $1$,最多能拼出的字符串数目,那么状态转移方程为:
1 | if i >= cost_zero[k] and j >= cost_one[k] |
其中 $k$ 表示第 $k$ 个字符串,$cost_zero[k]$ 和 $cost_one[k]$ 表示该字符串中 $0$ 和 $1$ 的个数。我们依次枚举这些字符串,并根据状态转移方程更新所有的 $dp(i, j)$。注意由于每个字符串只能使用一次(即有限背包),因此在更新 $dp(i, j)$ 时,$i$ 和 $j$ 都需要从大到小进行枚举。
最终的答案即为所有 $dp(i, j)$ 中的最大值。
1 |
|
参考文献
作者:LeetCode
链接:https://leetcode-cn.com/problems/ones-and-zeroes/solution/yi-he-ling-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true