07 2024 档案
摘要:今天的题目真是给我做恶心了 134. 加油站 暴力方法很容易写出来,但在力扣上运行会超时。 class Solution { int[] gas; int[] cost; public int canCompleteCircuit(int[] gas, int[] cost) { this.gas
阅读全文
摘要:55. 跳跃游戏 这道题我是从后往前做的,但由于用了递归,速度会慢一些,但整体时间复杂度也是O(N)。 我的思路其实就是找到最后一个可以到达目标位置处的下标,如果不存在这样的位置,就说明最后一个位置不可达。假设找到了,我们就需要去判断找到的这个位置是否可达,此时它的可达性与最后一个位置的可达性是完全
阅读全文
摘要:455. 分发饼干 思路:既然要满足最多的小孩吃到饼干,那么肯定优先满足胃口小的更能满足最多的。因此,先对两个数组排序。每次选择最小的能满足当前孩子的饼干。 class Solution { public int findContentChildren(int[] g, int[] s) { Arr
阅读全文
摘要:39. 组合总和 与216. 组合总和 III不同,不要求每个数字仅能使用一次。但这样很容易出现重复的结果,剪枝还是要注意。不过这道题让我更认识到把回溯问题看成是一个多叉树的遍历的问题,当遇到一个题目,先画出它的树结构,也就是代码随想录中的这张图,for循环(横向遍历)怎么做,递归(纵向遍历)又怎么
阅读全文
摘要:77. 组合 我的这个解法还算挺简单易懂的,还是看注释 class Solution { List<List<Integer>> ans = new ArrayList(); //存储最终结果集合 List<Integer> tmp = new ArrayList(); //记录单次的path pu
阅读全文
摘要:669. 修剪二叉搜索树 先贴上我自己的答案吧,一次写出来了,但其实很多地方都应该进行优化,没有完全利用好搜索树的性质。先看注释,理清自己的思路吧。 总体思路就是先对左右两个子树修剪,再根据根节点是否需要删除进行重构。这一操作和昨天的删除二叉搜索树中的节点操作是类似的。重构部分最复杂的就是左右子树都
阅读全文
摘要:235. 二叉搜索树的最近公共祖先 总体上思想与236. 二叉树的最近公共祖先思路是一致的,都是去搜索p,q的位置。这个大框架是最难理解的部分,具体可以再去看看236的题解。这道题在其基础上利用了搜索树的性质,当根节点的val大于pq两者时,就去左子树找结果即可;反之则去右子树中查找。当p,q一个比
阅读全文
摘要:530. 二叉搜索树的最小绝对差 二叉搜索树经常要用到其中序遍历是递增的这一性质,因此,这里经常会用到这种套路,即中序遍历,然后使用一个pre记录前一个访问的节点,pre初值设置为null即可。 对于这道题,使用dif存储已经遍历到的位置中最小的差值,当遇到更小的差值再去更新。总体上就是中序遍历,因
阅读全文
摘要:654. 最大二叉树 这道题和昨天的根据中序后序遍历构造二叉树比较相似。借鉴那个思路去做就差不多。 class Solution { public TreeNode constructMaximumBinaryTree(int[] nums) { return construct(nums, 0,
阅读全文
摘要:513. 找树左下角的值 这道题与199. 二叉树的右视图的思路是相同的。也就可以分为递归和迭代两种方式,对于这两道题来说,迭代就是使用层序遍历的方式找到最左或最右的值即可。513这题不同的一点是,只需要找到最底层最左侧的值,而不需每一层都保存。因此考虑使用一个a_depth存储目前找到最深的结果的
阅读全文
摘要:110. 平衡二叉树 class Solution { public boolean isBalanced(TreeNode root) { if(root == null) return true; return isBalanced(root.left) && isBalanced(root.r
阅读全文
摘要:226. 翻转二叉树 //这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了 class Solution { public TreeNode invertTree(TreeNode root) { St
阅读全文
摘要:Day 13 二叉树part01 二叉树的递归遍历 这个用递归就好,现在写起来基本没问题 二叉树的迭代遍历 这个是重点,今天写的时候居然一次写出来了,多刷还是有用的。前中后三种遍历方式,其迭代版本的难度排序 前 < 中 < 后。所以写的时候也是按这个顺序去做的。 144. 二叉树的前序遍历 使用一个
阅读全文
摘要:[150. 逆波兰表达式求值](https://leetcode.cn/problems/reverse-string/) 使用栈即可,遍历token数组,遇到运算符就弹栈,取出两个数做运算然后压栈。遇到数字就压栈。最终栈中剩余的唯一数字就是结果。 class Solution { public i
阅读全文
摘要:[151. 反转字符串中的单词](https://leetcode.cn/problems/reverse-string/) class Solution { public String reverseWords(String s) { StringBuilder sb = new StringBu
阅读全文
摘要:344. 反转字符串 class Solution { public void reverseString(char[] s) { int left = 0, right = s.length - 1; while(left < right){ char tmp = s[left]; s[left]
阅读全文
摘要:454. 四数相加 II // 这道题使用哈希就可解决,使用一个map存储前两个数组中,所有组合产生的sum的频率;对于后两个数组中所有的组合,每出现一个和的相反数出现在map中,则代表出现了这个相反数频率个组合可以满足四数相加为0 class Solution { public int fourS
阅读全文
摘要:242. 有效的字母异位词 383. 赎金信 class Solution { //这里只给出了242的代码,赎金信的解法可以说是基本相同的 public boolean isAnagram(String s, String t) { int[] map = new int[26]; for(cha
阅读全文
摘要:24. 两两交换链表中的节点 迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。 递归的版本:这道题用递归做简直不要太简单,首先明白递归结束的条件,显然当链表为空
阅读全文
摘要:203. 移除链表元素 class Solution { public ListNode removeElements(ListNode head, int val) { ListNode virHead = new ListNode(0, head); ListNode tmp = virHead
阅读全文
摘要:977. 有序数组的平方 class Solution { public int[] sortedSquares(int[] nums) { int[] ans = new int[nums.length]; int left = 0, right = nums.length - 1; for(in
阅读全文
摘要:704. 二分查找 这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种 class Solution { public int search(int[] nums, int target) { int left = 0, right = nums.length; w
阅读全文