<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[NUSMYDREAM的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/NUSMYDREAM</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; NUSMYDREAM]]></copyright><item><title><![CDATA[6.18 二叉树完结]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125347572</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125347572</guid><author>NUSMYDREAM</author><pubDate>Mon, 04 Jul 2022 18:34:32 +0800</pubDate><description><![CDATA[这个终止条件刚好和给一个空树的情况相同


删除二叉搜索树中的结节点

这道题犯了个小错误，一直没有ac，原因如下：if if else:这样else始终和最后一个if匹配，如果通过第一个if，没通过第二个if，但是也会进入到else中，这样就错了，但是如果if里面都有return，可以这么分情况写（如下），否则如果只是进入到一个条件中，就老老实实写else if。





插入和删除操作一样：有返回值的话，可以利用返回值完成新改变的节点与其父节点的赋值操作比如在插入操作中


通过递归函数返回值完成了新]]></description><category></category></item><item><title><![CDATA[6.15 二叉树的最近公共祖先]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125305716</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125305716</guid><author>NUSMYDREAM</author><pubDate>Wed, 15 Jun 2022 22:40:27 +0800</pubDate><description><![CDATA[注意：最近公共祖先可以是节点本身


 下面这版代码更好理解


 思想：这个每层的情况可以根据p、q在左子树还是右子树来讨论那么就有三种情况，都在左子树，都在右子树，两边各一个


总结：公共祖先的问题可以归类为p、q节点是否在同一子树中的问题，也就是三种情况。...]]></description><category></category></item><item><title><![CDATA[6.13、14 二叉树]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125269742</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125269742</guid><author>NUSMYDREAM</author><pubDate>Wed, 15 Jun 2022 00:30:03 +0800</pubDate><description><![CDATA[验证二叉搜索树

思想：二叉搜索树的中序遍历满足升序序列，所以可以用list存储中序遍历结果，再对list判断。错误的版本过不了这个例子：[5,4,6,null,null,3,7]，左子树的节点全部小于根节点，右子树的节点全部大于根节点


中序遍历一遍，递归判断


二叉搜索树的最小绝对值

思想：在中序遍历过程中去更新最小的差值也可以放在list中，然后循环遍历list去找到最小的差值...]]></description><category></category></item><item><title><![CDATA[6.11、12 二叉树]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125232869</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125232869</guid><author>NUSMYDREAM</author><pubDate>Sun, 12 Jun 2022 22:41:05 +0800</pubDate><description><![CDATA[终止条件：子树为空的时候，空树自然是平衡二叉树了。返回值：而对于一颗树，它是一个平衡二叉树需要满足三个条件：它的左子树是平衡二叉树，它的右子树是平衡二叉树，它的左右子树的高度差不大于1。本级递归应该做什么：一级递归有三个节点，root、left、right，需要判断left和right是不是平衡的且以left为根节点和以right为根节点的树高度差是否...]]></description><category></category></item><item><title><![CDATA[6.10 二叉树]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125219645</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125219645</guid><author>NUSMYDREAM</author><pubDate>Sat, 11 Jun 2022 10:49:24 +0800</pubDate><description><![CDATA[满二叉树：如果一棵二叉树只有度为0的结点和度为2的结点，并且度为0的结点在同一层上，则这棵二叉树为满二叉树。完全二叉树：完全二叉树中，除了最底层节点可能没填满外，其余每层节点数都达到最大值，并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层，则该层包含 1~ 2^(h-1) 个节点。二叉搜索树：也叫作二叉排序树前面介绍的树，都没有数值的，而二叉搜索树是有数值的了，二叉搜索树是一个有序树。二叉平衡树（AVL）：它是一棵空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵]]></description><category></category></item><item><title><![CDATA[6.9 柠檬水找零]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125197988</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125197988</guid><author>NUSMYDREAM</author><pubDate>Thu, 09 Jun 2022 12:15:43 +0800</pubDate><description><![CDATA[审题要清晰，只有5、10、20三种面值，为每一种面值的零钱维护一个状态变量即可，没有必要用map做。



	
	贪心方法："课程安排下找最多可以上多少节课"系列问题
	
	
	类似问题还有：452、605、455、253等 直接秒杀！
	


无重叠区间




首先，为什么贪心？可以看出来。这就是一种类似于“活动安排的问题”，无非就是三种策略：尽早占用、时间占用少的活动先安排、早完成的活动先安排。前面两种策略都可以找到反例推翻。早完成的活动先安排的策略就是使剩余的可安排时间段极大化，以便安排尽可能多的相]]></description><category></category></item><item><title><![CDATA[6.7 分发饼干 && 摆动序列 && 跳跃游戏 && 加油站（贪心算法）]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125160162</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125160162</guid><author>NUSMYDREAM</author><pubDate>Wed, 08 Jun 2022 13:55:28 +0800</pubDate><description><![CDATA[思想：先用大的饼干去满足胃口大的孩子，以此来保证大饼干的收益最大化。


摆动序列

思想：pre当前的摆动序列的末尾，flag==true代表前面是一个波峰，false代表前面是一个波谷。但是这道题是有三种情况，前面既不是波峰也不是波谷，所以我第一次的代码写的有问题而且很繁琐，不应该设置flag，反而复杂了。直接由前一个差值来表示波峰、波谷


AC


买卖股票的最佳时机2

思想：把整体利润拆分为每天的利润，然后只用收集每天的正利润（真正赚钱的买卖股票时机）。想获得利润至少要两天为一个交易单元假如第0]]></description><category></category></item><item><title><![CDATA[6.6 动态规划子序列问题]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125153921</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125153921</guid><author>NUSMYDREAM</author><pubDate>Mon, 06 Jun 2022 23:03:50 +0800</pubDate><description><![CDATA[注意：子数组是指连续序列思想：1.定义dp[i][j]为 以下标i为结尾的A，和以下标j为结尾的B，最长重复子数组长度为dp[i][j]2.确定递推公式：当A[i - 1] 和B[j - 1]相等的时候，dp[i][j] = dp[i - 1][j - 1] + 1;3.初始化：这里的初始化有些特殊，是nums[0]==nums[j]时候dp[0][j]=1，其余情况为0。dp[i][0]同理。


这里我的dp数组是以i、j结尾的子序列，其实这样会导致初始化有些复杂。dp数组应该定义为下标i-1为结尾的A]]></description><category></category></item><item><title><![CDATA[6.5 零钱兑换1、2 && 组合总和]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125135722</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125135722</guid><author>NUSMYDREAM</author><pubDate>Sun, 05 Jun 2022 21:41:43 +0800</pubDate><description><![CDATA[思想：完全背包，只是求最小硬币数那么钱币有顺序和没有顺序都可以，都不影响钱币的最小个数。所以本题并不强调集合是组合还是排列。如果求组合数就是外层for循环遍历物品，内层for遍历背包。如果求排列数就是外层for遍历背包，内层for循环遍历物品。本题钱币数量可以无限使用，那么是完全背包。所以遍历的内循环是正序


思想：完全背包、组合数（外层物品，内层背包）


组合总和4

思想：完全背包、排列数（外层背包，内层物品）既然递归公式是 dp[i] += dp[i - j]，那么dp[0] 一定为1，dp[0]]]></description><category></category></item><item><title><![CDATA[6.2 最长递增子序列 && 分割等和子集]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125096329</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125096329</guid><author>NUSMYDREAM</author><pubDate>Sun, 05 Jun 2022 12:05:02 +0800</pubDate><description><![CDATA[思想：1.dp[i]的定义dp[i]表示i之前包括i的最长上升子序列的长度。2. 状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以：if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);这里不是要dp[i] 与 dp[j] + 1进行比较，而是要取dp[j] + 1的最大值。3.dp[i]的初始化每一个i，对应的dp[i]（即最长上升子序列）起始大小至少都是是1


思想：0-1背包1.确定dp数组在0-]]></description><category></category></item><item><title><![CDATA[6.1 最大正方形]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125079859</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125079859</guid><author>NUSMYDREAM</author><pubDate>Wed, 01 Jun 2022 21:40:05 +0800</pubDate><description><![CDATA[思想：一动态方程定义的是范围matrix(0, 0) 到 matrix(i, j)的最大正方形，但是找不到递推关系，dp[i][j]应该表示以第i行第j列为右下角所能构成的最大正方形边长，并且这个min的意思比较难理解，可以自己手推一波理解一下。我的评价是这道题有点难想，尤其是min的设定。




完全平方数




个人觉得完全平方数和凑零钱有些像，但又不完全像]]></description><category></category></item><item><title><![CDATA[5.31 打家劫舍 && 打家劫舍2、3 （动态规划）]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125074366</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125074366</guid><author>NUSMYDREAM</author><pubDate>Tue, 31 May 2022 23:05:19 +0800</pubDate><description><![CDATA[状态方程：dp[i]=max{ dp[i-k]+nums[i] } 其中2]]></description><category></category></item><item><title><![CDATA[5.29 单词拆分 && 乘积最大（动态规划）]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125038081</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125038081</guid><author>NUSMYDREAM</author><pubDate>Tue, 31 May 2022 21:39:48 +0800</pubDate><description><![CDATA[单词拆分

原理思想：完全背包

1.确定dp数组以及下标的含义

**dp[i] : 字符串长度为i的话，dp[i]为true，表示可以拆分为一个或多个在字典中出现的单词**。

2. 确定递推公式

如果确定dp[j] 是true，且 [j, i] 这个区间的子串出现在字典里，那么dp[i]一定是true。（j &lt; i ）。

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 &amp;&amp; dp[j]是true) 那么 dp[i] = true。

3.dp数组如何初始化

]]></description><category></category></item><item><title><![CDATA[5.30 卡特兰数]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125053262</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125053262</guid><author>NUSMYDREAM</author><pubDate>Mon, 30 May 2022 20:40:17 +0800</pubDate><description><![CDATA[1、定义：是一种经典的组合数，经常出现在各种计算中，

其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020,

2、公式：

（1）、一般公式 （ 当 n &gt; 35 时， long long )

令 h(0)=1, h(1)=1，]]></description><category></category></item><item><title><![CDATA[5.28 跳跃游戏 && 不同路径 && 最小路径和 && 不同的二叉搜索树（排序树）]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125019563</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/125019563</guid><author>NUSMYDREAM</author><pubDate>Sat, 28 May 2022 23:20:50 +0800</pubDate><description><![CDATA[跳跃游戏

原理思想：贪心算法，每个位置都计算自己能达到的最远距离，同时每个位置要判断自己是否可达，也就是本位置需要在当前最远能到达的距离中。最终计算出来能到达的最远距离，与数组长度比较即可。


public boolean canJump(int[] nums) {
    	int maxdis=nums[0];
    	for(int i=1; i&lt;nums.length; i++) {
    		if(maxdis&gt;=i) { //判断是否可达
    			maxdis=Math]]></description><category></category></item><item><title><![CDATA[5.20 最大数组和 && 比特计数位（动态规划）]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124884821</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124884821</guid><author>NUSMYDREAM</author><pubDate>Sat, 28 May 2022 16:13:09 +0800</pubDate><description><![CDATA[最大数组和

状态方程：




public int maxSubArray(int[] nums) {
    	int[] dp = new int[nums.length];
    	dp[0]=nums[0];
//    	dp[1]=nums[1];
    	for(int i=1; i&lt;nums.length; i++) {
    		if(dp[i-1]&lt;=0) {
    			dp[i]=nums[i];
    			continue;
    		}
    ..]]></description><category></category></item><item><title><![CDATA[5.14 合并k个升序链表 && 下一个排列]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124770351</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124770351</guid><author>NUSMYDREAM</author><pubDate>Fri, 20 May 2022 15:47:46 +0800</pubDate><description><![CDATA[合并k个升序链表


public ListNode mergeKLists(ListNode[] lists) {
    	  ListNode res = new ListNode();
          res = null; //new一个对象和null并不相等，new是随机分配一块地址空间
    	  for(int i=0; i&lt;lists.length; i++) {
    		  res=mergeTwoLists(res, lists[i]);
    	  }
    ..]]></description><category></category></item><item><title><![CDATA[5.13 有效的括号 && 查找特定元素范围]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124756713</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124756713</guid><author>NUSMYDREAM</author><pubDate>Fri, 13 May 2022 18:24:41 +0800</pubDate><description><![CDATA[有效的括号

easy money


class Solution {
    public boolean isValid(String s) {
     StringBuilder a = new StringBuilder();
    	for(int i=0; i&lt;s.length(); i++) {
    		if(s.charAt(i)=='[' || s.charAt(i)=='{' || s.charAt(i)=='(') {
    			a.append(s.charA..]]></description><category></category></item><item><title><![CDATA[5.13 单词搜索 && 删除链表的倒数第k个结点]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124731564</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124731564</guid><author>NUSMYDREAM</author><pubDate>Fri, 13 May 2022 17:20:59 +0800</pubDate><description><![CDATA[单词搜索

虽然是个图的搜索，但本质还是回溯。不是dfs，两者的区别在于dfs不会恢复现场，而回溯需要恢复现场。


class Solution {
	boolean flag = false;
    public boolean exist(char[][] board, String word) {
    	int[][] visited = new int[board.length][board[0].length];
    	for(int i=0; i&lt;board.length;..]]></description><category></category></item><item><title><![CDATA[5.11 括号生成 && 子集]]></title><link>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124559109</link><guid>https://blog.youkuaiyun.com/NUSMYDREAM/article/details/124559109</guid><author>NUSMYDREAM</author><pubDate>Wed, 11 May 2022 15:47:52 +0800</pubDate><description><![CDATA[括号生成

原理思想：我并没有减枝，我直接把所有结果找到，然后取出不满足条件的结果，时间复杂度较高



其中check函数思想如下：（括号匹配）

1.顺序扫描算数表达式（表现为一个字符串），当遇到左括号时候让该括号保存至list；
2.当扫描到右括号时，查看当前list里面是否有内容，若为空，说明格式不对，返回错误标识。如果有内容，则弹出list末尾元素；
3.字符串循环扫描结束时，若list非空（即list中尚有左括号），则说明左括号多于右括号，匹配失败。若list为空，说明左右括号格式正确，返回正确]]></description><category></category></item></channel></rss>