- 博客(27)
- 收藏
- 关注
原创 6.18 二叉树完结
这个终止条件刚好和给一个空树的情况相同删除二叉搜索树中的结节点这道题犯了个小错误,一直没有ac,原因如下:if if else:这样else始终和最后一个if匹配,如果通过第一个if,没通过第二个if,但是也会进入到else中,这样就错了,但是如果if里面都有return,可以这么分情况写(如下),否则如果只是进入到一个条件中,就老老实实写else if。插入和删除操作一样:有返回值的话,可以利用返回值完成新改变的节点与其父节点的赋值操作比如在插入操作中通过递归函数返回值完成了新
2022-07-04 18:34:32 225 1
原创 6.15 二叉树的最近公共祖先
注意:最近公共祖先可以是节点本身 下面这版代码更好理解 思想:这个每层的情况可以根据p、q在左子树还是右子树来讨论那么就有三种情况,都在左子树,都在右子树,两边各一个总结:公共祖先的问题可以归类为p、q节点是否在同一子树中的问题,也就是三种情况。...
2022-06-15 22:40:27 235
原创 6.13、14 二叉树
验证二叉搜索树思想:二叉搜索树的中序遍历满足升序序列,所以可以用list存储中序遍历结果,再对list判断。错误的版本过不了这个例子:[5,4,6,null,null,3,7],左子树的节点全部小于根节点,右子树的节点全部大于根节点中序遍历一遍,递归判断二叉搜索树的最小绝对值思想:在中序遍历过程中去更新最小的差值也可以放在list中,然后循环遍历list去找到最小的差值...
2022-06-15 00:30:03 153
原创 6.11、12 二叉树
终止条件:子树为空的时候,空树自然是平衡二叉树了。返回值:而对于一颗树,它是一个平衡二叉树需要满足三个条件:它的左子树是平衡二叉树,它的右子树是平衡二叉树,它的左右子树的高度差不大于1。本级递归应该做什么:一级递归有三个节点,root、left、right,需要判断left和right是不是平衡的且以left为根节点和以right为根节点的树高度差是否...
2022-06-12 22:41:05 201
原创 6.10 二叉树
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树:完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。二叉搜索树:也叫作二叉排序树前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。二叉平衡树(AVL):它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵
2022-06-11 10:49:24 109
原创 6.9 柠檬水找零
审题要清晰,只有5、10、20三种面值,为每一种面值的零钱维护一个状态变量即可,没有必要用map做。 贪心方法:"课程安排下找最多可以上多少节课"系列问题 类似问题还有:452、605、455、253等 直接秒杀! 无重叠区间首先,为什么贪心?可以看出来。这就是一种类似于“活动安排的问题”,无非就是三种策略:尽早占用、时间占用少的活动先安排、早完成的活动先安排。前面两种策略都可以找到反例推翻。早完成的活动先安排的策略就是使剩余的可安排时间段极大化,以便安排尽可能多的相
2022-06-09 12:15:43 1022
原创 6.7 分发饼干 && 摆动序列 && 跳跃游戏 && 加油站(贪心算法)
思想:先用大的饼干去满足胃口大的孩子,以此来保证大饼干的收益最大化。摆动序列思想:pre当前的摆动序列的末尾,flag==true代表前面是一个波峰,false代表前面是一个波谷。但是这道题是有三种情况,前面既不是波峰也不是波谷,所以我第一次的代码写的有问题而且很繁琐,不应该设置flag,反而复杂了。直接由前一个差值来表示波峰、波谷AC买卖股票的最佳时机2思想:把整体利润拆分为每天的利润,然后只用收集每天的正利润(真正赚钱的买卖股票时机)。想获得利润至少要两天为一个交易单元假如第0
2022-06-08 13:55:28 298
原创 6.6 动态规划子序列问题
注意:子数组是指连续序列思想: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
2022-06-06 23:03:50 111
原创 6.5 零钱兑换1、2 && 组合总和
思想:完全背包,只是求最小硬币数那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。所以本题并不强调集合是组合还是排列。如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。本题钱币数量可以无限使用,那么是完全背包。所以遍历的内循环是正序思想:完全背包、组合数(外层物品,内层背包)组合总和4思想:完全背包、排列数(外层背包,内层物品)既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]
2022-06-05 21:41:43 132
原创 6.2 最长递增子序列 && 分割等和子集
思想: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-
2022-06-05 12:05:02 126
原创 6.1 最大正方形
思想:一动态方程定义的是范围matrix(0, 0) 到 matrix(i, j)的最大正方形,但是找不到递推关系,dp[i][j]应该表示以第i行第j列为右下角所能构成的最大正方形边长,并且这个min的意思比较难理解,可以自己手推一波理解一下。我的评价是这道题有点难想,尤其是min的设定。完全平方数个人觉得完全平方数和凑零钱有些像,但又不完全像
2022-06-01 21:40:05 98
原创 5.29 单词拆分 && 乘积最大(动态规划)
单词拆分原理思想:完全背包1.确定dp数组以及下标的含义**dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词**。2. 确定递推公式如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。3.dp数组如何初始化
2022-05-31 21:39:48 177
原创 5.30 卡特兰数
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 > 35 时, long long )令 h(0)=1, h(1)=1,
2022-05-30 20:40:17 157
原创 5.28 跳跃游戏 && 不同路径 && 最小路径和 && 不同的二叉搜索树(排序树)
跳跃游戏原理思想:贪心算法,每个位置都计算自己能达到的最远距离,同时每个位置要判断自己是否可达,也就是本位置需要在当前最远能到达的距离中。最终计算出来能到达的最远距离,与数组长度比较即可。public boolean canJump(int[] nums) { int maxdis=nums[0]; for(int i=1; i<nums.length; i++) { if(maxdis>=i) { //判断是否可达 maxdis=Math
2022-05-28 23:20:50 195
原创 5.20 最大数组和 && 比特计数位(动态规划)
最大数组和状态方程:public int maxSubArray(int[] nums) { int[] dp = new int[nums.length]; dp[0]=nums[0];// dp[1]=nums[1]; for(int i=1; i<nums.length; i++) { if(dp[i-1]<=0) { dp[i]=nums[i]; continue; } ..
2022-05-28 16:13:09 61
原创 5.14 合并k个升序链表 && 下一个排列
合并k个升序链表public ListNode mergeKLists(ListNode[] lists) { ListNode res = new ListNode(); res = null; //new一个对象和null并不相等,new是随机分配一块地址空间 for(int i=0; i<lists.length; i++) { res=mergeTwoLists(res, lists[i]); } ..
2022-05-20 15:47:46 47
原创 5.13 有效的括号 && 查找特定元素范围
有效的括号easy moneyclass Solution { public boolean isValid(String s) { StringBuilder a = new StringBuilder(); for(int i=0; i<s.length(); i++) { if(s.charAt(i)=='[' || s.charAt(i)=='{' || s.charAt(i)=='(') { a.append(s.charA..
2022-05-13 18:24:41 84
原创 5.13 单词搜索 && 删除链表的倒数第k个结点
单词搜索虽然是个图的搜索,但本质还是回溯。不是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<board.length;..
2022-05-13 17:20:59 98
原创 5.11 括号生成 && 子集
括号生成原理思想:我并没有减枝,我直接把所有结果找到,然后取出不满足条件的结果,时间复杂度较高其中check函数思想如下:(括号匹配)1.顺序扫描算数表达式(表现为一个字符串),当遇到左括号时候让该括号保存至list;2.当扫描到右括号时,查看当前list里面是否有内容,若为空,说明格式不对,返回错误标识。如果有内容,则弹出list末尾元素;3.字符串循环扫描结束时,若list非空(即list中尚有左括号),则说明左括号多于右括号,匹配失败。若list为空,说明左右括号格式正确,返回正确
2022-05-11 15:47:52 97
原创 5.2 全排列 && 目标和 (都是回溯)
全排列话不多说,直接上代码第一次用hashmap去除,复杂度有点高class Solution { public List<List<Integer>> permute(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new LinkedList<>(); if(nums.length==0)return res; //去除特殊情
2022-05-03 17:17:27 334
原创 4.28 电话号码组合 && 组合总和(回溯)
电话号码的字母组合原理思想:回溯不需要剪枝,注意回溯结束的条件和恢复现场。由于这道题是求组合的种类,所以需要恢复现场寻找不同的组合。public List<String> solution(String digits) { List<String> res = new LinkedList<>(); int length = digits.length(); //判断空值,LeetCode里面的测试用例总有空值 if(length==
2022-05-02 22:24:20 239
原创 4.27 盛最多水的容器 && 三数之和(都是双指针)
盛最多水的容器原理:ij指针从两边各自滑动,滑动的条件是解题的关键,解决时间复杂度较高的问题public int solution(int[] height) {// int ans=0, x=0;// for(int i=0; i<height.length-1; i++) {// for(int j=i+1; j<height.length; j++) {// x = (j-i)*Math.min(height[i], height[j]);// an
2022-04-27 22:05:58 410
原创 数据结构、算法笔记
一、一些小的point异或运算:1)0^N=N, N^N=02) 满足交换和结合,所以异或运算可以顺序颠倒,但是结果相同3)两数相异或可以看做无进位相加可以用于交换两个数,不需要开辟新的空间题目:给一个数组,有一个数出现了奇数次,其他数都出现了偶数次,求该出现奇数次的数字题解:用0异或每一个数,由于出现偶数次,所以异或完还是0,出现奇数次的数和0异或完是该数。二、排序三、链表四、数五、图...
2022-04-27 16:00:45 40
原创 4.26 中心拓展法
中心拓展法解决问题:回文字符原理:循环各字符,拿到一个字符s.charAT(i),分别先向左或者右边扩展,寻找与中心点(也就是该字符)相等的字符,寻找结束。之后同时拓展左右两边,寻找左右两点相等的字符,直至不相等,则以中心字符的寻找结束,进入下一次以s.charAT(i+1)为中心来拓展寻找回文字符。public String longestPalindrome(String s) { if(s==null || s.length()==0)return ""; int
2022-04-26 17:51:24 415
原创 4.25 滑动窗口与KMP算法
滑动窗口解决问题:无重复字符的最长子串class Solution { public int lengthOfLongestSubstring(String s) { int length = s.length(); int ans=0, start=0, end=0; HashMap<Character, Integer> map = new HashMap<>(); for( ; end < length; end++) {
2022-04-26 15:01:12 758
原创 语音去噪深度学习模型论文总结(大多基于transformer)
深度学习模型: 我总结了之前看的模型,并又寻找了基于transformer的模型,挑选了四个性能较好(评判标准是各种语音评价指标、该论文提出的模型与已有模型相比较得到的结果)的模型,其中前面三个是基于transformer的模型,最后一个是基于CRN网络的模型。每个论文的链接都在介绍后给出。《T-GSA: Transformer with Gaussian-Weighted Self-Attention for Speech Enhancement》该论文发表于2020.5的ICASSP上。提出了一
2022-01-10 11:18:33 7872 12
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人