摘要:
* @Description 问题为骑士跳 N 步有多少种跳法* 我们以步数 N 分割问题,此时发现,影响问题解的不只是步数,还在于骑士当前处在什么位置* 因为这决定了骑士下一步会不会越界* 所以我们以骑士所处的位置 x,y 以及剩余跳的步数 n 来定义问题* g(x,y,n) 表示处在 x,y 位 阅读全文
摘要:
* @Description 从左上角开始移动,每次移动可以向右也可以向下* 问题本身自带状态转移关系,下一步状态基于上一步位置* 建立缓存时以位置为坐标,G(x,y) 表示从 x/y 坐标开始行动可以获取的最大价值* 因为有最大的含义, x/y 坐标可以唯一的确定 从本位置开始移动可获得的最大价值 阅读全文
摘要:
首先暴力搜索: public final int maxSubArray1(int[] nums) { int max = Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums.leng 阅读全文
摘要:
看到题目,一个变种的八皇后,在矩阵中寻找路径。 关于回溯的思路在博客: Burst Balloons(leetcode戳气球,困难)从指数级时间复杂度到多项式级时间复杂度的超详细优化思路(回溯到分治到动态规划 ) 中有非常详细的描述。 本题优化时间复杂度的关键在于剪枝,当越界、字符不匹配、路径已走过 阅读全文
摘要:
* @Description 将一条绳子剪成任意 m 段,m 大于 1 ,求最大积 * 决定问题规模的参数为绳子的长度 n * 按 n 进行分治,G( n ) 为长度为 n 的绳子分割后可得的最大积,可列出状态转移方程: * G( n ) = max { G(n-1)*1 , G(n-2)*2... 阅读全文
摘要:
一道简单题目,DP 的递归表示竟然无法 AC,只能用递推表示。解题思路: * @Description nums 长度决定为题规模 * 按 nums 长度区间进行分治 * G(i) 代表前 i 个元素中可得的最大分钟数 * 因为题目要求,相邻元素不能选取,所以要确定 G(i-1) 与 G(i) 的关 阅读全文
摘要:
题目非常简单,之所以记录一下是因为总是忽略中序遍历的特性:排序二叉树中序遍历会得到一个有序数组。该特性很实用也很神奇,就像一颗满二叉排序树的根节点必然是对应有序数组的中点一样。该特性可以帮助我们更好的理解排序树的结构。 List<Integer> re=new LinkedList<Integer> 阅读全文
摘要:
很多清奇的解法不是靠拍脑袋一蹴而就的,而是随着传统解法一步一步优化来的。刷题时不需要经常焦虑自己没有创新毒辣的解题思路,应该从传统解法开始,考虑当前解法有什么可优化的点,并去实现它们。 最容易想到的自然是暴力法,我们假设每个元素都可以作为买入元素的前提下,再假设在其之后的每个元素尝试卖出,纪录最大差 阅读全文
摘要:
两种解法,DFS 与 BFS ,均已通过。对于 DFS 来说,我们需要从右到左遍历所有节点,并在每次遍历时记录当前深度。如果当前深度与结果数组长度相同,则为该层可以右视到的节点: /** * @Author Nxy * @Date 2020/5/9 * @Description DFS 解法 */ 阅读全文
摘要:
最开始使用 DP ,因为题目中给的问题空间范围较大,缓存使用数组的话对连续的内存空间要求过高。故采用 hash 表做缓存: public int maxScore(int[] cardPoints, int k) { int length = cardPoints.length; Map<Strin 阅读全文