
leetcode
文章平均质量分 56
Mosiclone
这个作者很懒,什么都没留下…
展开
-
leetcode 1269. 停在原地的方案数 每日一题 动态规划
有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。示例 1:输入: steps = 3, arrLen = 2输出: 4解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。向右,原创 2021-05-13 11:09:04 · 176 阅读 · 0 评论 -
leetcode1734 解码异或后的排列 异或基本知识
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。基本运算法则归零律:a ⊕ a = 0恒等律:a ⊕ 0 = a交换律:a ⊕ b = b ⊕ a原创 2021-05-11 10:28:30 · 164 阅读 · 2 评论 -
剑指 Offer 16. 数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。2^10 = 2^(1 * 3) * 2^(0 * 2 ) * 2^(1 * 1) * 2^(0 * 0)其中,10(10) = 1010(2);每次对可以判读当前对应二进制位是 0 还是 1 来判断是否把当前数乘到最后结果中。这里题目给的 n 的范围是 [-2 ^ 31,2 ^ 31 - 1],这样如果令 n = -n 时,n 会溢原创 2020-12-26 00:24:43 · 100 阅读 · 0 评论 -
剑指offer 04 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。首先这个题目可以用暴力方法加一定条件的剪枝,但是这样的时间复杂度是 O(mn) ,因为最坏的情况可能会遍历整个二维数组。还有一种方法是从左下角或者是右上角开始判断,这样每次比较都可以划分出一行或者一列,这时的时间复杂度为 O(m+n) 。主要说一下第二种算法的思路:1 首先选择左下角或者右上角是因为每次比较 Ma原创 2020-12-08 11:26:02 · 96 阅读 · 0 评论 -
leetcode 每日一题 463 岛屿的周长
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。到值为 1 的位置判断上下左右的的值是否为 1 ,或者是否为边缘。如果边上为 0,周长加 1;或者是边缘也会加 1。原创 2020-10-30 17:21:42 · 141 阅读 · 0 评论 -
leetcode 461 汉明距离 Hamming distance 讲解
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.WIKI 中给出的解释是 在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例子:1011101与1001001之间的汉明距离是2。2143896与2233796之间的汉明距离是3。"toned"与"原创 2020-10-29 23:09:36 · 352 阅读 · 0 评论 -
leetcode 每日一题 543 二叉树的直径 dfs方法
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。这里最长直径的边一定都是叶子结点,用深度遍历整个树。一般思路是找出节点左边的最大长度和右边的最大长度加起来可能就是最大直径,这里就只需要返回 max(right,left)。但是因为最长直径可能不过根节点,所以这里多加一个判断条件,如果当前节点的左子树最大长度和右子树最大长度之和大于当前最大长度就更新一下。class Solution { int max = 0;原创 2020-10-29 22:14:05 · 239 阅读 · 0 评论 -
leetcode 每日一题 129 求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。递归遍历到叶子结点时处理数字总和,遍历过程中,每次把当前的记录传下去。class Solution { int sum=0; public int sumNumbers(TreeNode root) { if(root==n原创 2020-10-29 21:04:54 · 111 阅读 · 0 评论 -
leetcode 每日一题 763 划分字母区间
题目:字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。例子:输入:S = “ababcbacadefegdehijhklij”输出:[9,7,8]解释:划分结果为 “ababcbaca”, “defegde”, “hijhklij”。每个字母最多出现在一个片段中。像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。首先看到题目赶紧有点复杂,想了几原创 2020-10-22 16:16:45 · 273 阅读 · 0 评论 -
leetcode 每日一题 52 N皇后 II
N皇后的详细解法可以看leetcode 每日一题 51 N皇后,这里只需要把 i==chars.length 下的添加解法改为 count++ 即可。package com.company;import java.util.Arrays;import java.util.LinkedList;import java.util.List;public class lc52 { int count = 0; public int totalNQueens(int n) { .原创 2020-10-17 13:34:22 · 147 阅读 · 1 评论 -
leetcode 每日一题 51 N皇后
题目链接:https://leetcode-cn.com/problems/n-queens/每日一题碰到 N皇后II 了,先做一下 N皇后。主要思路就是递归加回溯了,真·暴力解决也很简单,直接一直递归最后判断是否满足 N皇后 的条件即可。这里考虑尽可能的剪枝来降低时间消耗,首先题目给出 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上 。所以可以用这个条件来判断满足进入递归的条件,开始我的思路是每次填充一个皇后时,将她的横行、纵行、斜线行和反斜线行设置标记,下一层填充.原创 2020-10-17 13:21:15 · 215 阅读 · 2 评论 -
leetcode 每日一题 LCP 19 秋叶收藏集
我淦,开始把题目理解错了,把替换当作交换了。 T T本题可以用线性规划的思路来求解,左边的红色树叶状态为 1 ,中间的黄色树叶状态为 2 ,右边的红色树叶状态为 3 。status[i][j] 的含义是第 i 个树叶是第 j 个状态需要交换的最小次数。三种状态转移的公式分别对应三种状态:(其中 isColor 指当前树叶颜色是否为 Color )status[i][0] = status[i-1][0] + isYellow 因为第一种状态前面肯定也是第一种状态status[i][1] = m.原创 2020-10-04 00:12:19 · 152 阅读 · 0 评论 -
leetcode 14 最长公共前缀 奇淫巧技
常规思路,从前向后比较。代码如下:public class lc14 { public String longestCommonPrefix(String[] strs) { if (strs.length == 0) return ""; if (strs.length == 1) return strs[0]; String prefix = strs[0]; for (int i = 1; i < strs.lengt.原创 2020-09-30 11:56:01 · 123 阅读 · 0 评论 -
leetcode 每日一题 117 填充每个节点的下一个右侧节点指针 II
如果用队列层次遍历不难,直接撸代码:public class lc117 { public Node connect(Node root) { if ( root == null ) return null; Node temp; Deque<Node> deque = new LinkedList<>(); deque.addLast(root); while ( deque.size(..原创 2020-09-28 13:50:19 · 183 阅读 · 0 评论 -
leetcode 剑指offer 54 二叉搜索树的第k大节点
第 K 大节点即反中序遍历大第 K 个数。public class offer54 { int num=0; public int kthLargest(TreeNode root, int k) { if(root==null)return 0; return reverseInOrder(root,k); } public int reverseInOrder(TreeNode node,int k){ if (node.原创 2020-09-27 23:09:35 · 89 阅读 · 0 评论 -
leetcode 897 递增顺序查找树
直接递归中序遍历,把遍历的代码替换成修改节点的操作。小 tip ,增加了一个虚拟的根节点,这样根节点可以当作孩子节点来处理。代码如下:public class lc897 { TreeNode root = new TreeNode(0); TreeNode temp = root; public TreeNode increasingBST(TreeNode root) { if (root == null) return null; inO.原创 2020-09-27 22:46:27 · 148 阅读 · 0 评论 -
leetcode 998 最大二叉树 II
详细题目链接,类似题目654. 最大二叉树。由654可以总结出 按照中序遍历就是输入数组的顺序。由此可知,在数组最后添上一个数后会有三种情况。1.新节点在根节点上面,即 val>root.val 。2.新节点在最右节点的右下,即 temp.right==null&&temp.val>val 。3.新节点在根节点和最右节点的中间,这时需要对节点进行处理。三种例子如下:在第二种情况中寻找合适节点时会一直向右下移动,直到到达右下角即第三种情况。整理后代码如下:pu.原创 2020-09-27 21:37:57 · 222 阅读 · 1 评论 -
leetcode 654 最大二叉树
本题和 106 题类似,106. 从中序与后序遍历序列构造二叉树。不过本题每次递归函数内都是先找出最大值,然后最大值左边传入递归生成左子树,最大值右边传入递归生成右子树。106解题思路代码如下:public class lc654 { public TreeNode constructMaximumBinaryTree(int[] nums) { if (nums.length == 0) return null; TreeNode root = getNode.原创 2020-09-27 17:05:23 · 138 阅读 · 0 评论 -
leetcode 102 剑指Offer 32 二叉树的层次遍历
思路不难,直接用队列迭代就可以。遍历过程如下:代码如下:public class offer32 { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> ans = new LinkedList<>(); Deque<TreeNode> deque = new LinkedList<&.原创 2020-09-27 15:24:06 · 405 阅读 · 0 评论 -
leetcode 589 n叉树的前序遍历
递归算法如下:public class lc589 { List<Integer> ans = new LinkedList<>(); public List<Integer> preorder(Node root) { if (root==null)return null; ans.add(root.val); for(Node node : root.children){ .原创 2020-09-27 14:39:03 · 87 阅读 · 0 评论 -
leetcode 每日一题 235 二叉搜索树的最近公共祖先
存在三种情况:1.p 和 q 都小于 root 的值,到 root 的左子树寻找2.p 和 q 都大于 root 的值,到 root 的右子树寻找3.root 在 [p,q] 区间内,返回 root开始以为 p.val 一定大于 q.val ,直接比较了。但是有个用例是 p=2 ; q=1 。代码如下:public class lc235 { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNo.原创 2020-09-27 11:07:41 · 119 阅读 · 0 评论 -
leetcode 每日一题 113 路径总和2
思路递归+回溯。代码如下:import java.util.Deque;import java.util.LinkedList;import java.util.List;public class lc113 { List<List<Integer>> ans = new LinkedList<>(); Deque<Integer> deque = new LinkedList<>(); public Li.原创 2020-09-27 00:49:55 · 128 阅读 · 0 评论 -
leetcode 每日一题 106 中序后序构造二叉树
根据定义,后序遍历的最后一个是父节点,和中序遍历序列整合。可以分别得出左右孩子的中序遍历序列和后序遍历序列,一直递归可以得到整个二叉树。代码如下:public class lc106 { public TreeNode buildTree(int[] inorder, int[] postorder) { if (inorder.length == 0) return null; if (inorder.length == 1) return new Tre.原创 2020-09-26 23:36:57 · 187 阅读 · 0 评论 -
leetcode 每日一题 501 二叉搜索树中的众数
本题要求是在二叉排序树中找出众数,可以在中序遍历的过程中就将当前的众数存储在数组里,也可以先中序遍历得到有序数组后再对数组进行处理得到众数的数组。代码如下:public class lc501{ int count = 0; int maxCount = 1; int currentNum = -1; List<Integer> ans = new ArrayList<>(); public int[] findMode(TreeNod.原创 2020-09-25 15:04:24 · 192 阅读 · 0 评论 -
leetcode 每日一题 617 合并二叉树
又是树的题目,直接递归吧。先理清楚节点各种情况的处理方法,总结了一下如下图:首先,上面是 t1 和 t2 可能出现的情况和处理方式,下面是对例子画了一下递归的讲解图。最后写成代码如下:public class lc617 { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null) return t2; if (t2 == null) return t1; t1.原创 2020-09-23 23:58:35 · 712 阅读 · 0 评论 -
leetcode 每日一题 968 监控二叉树
做题的思路是贪心 + 递归。自下而上遍历,每次都在尽可能远的地方安装摄像头,这样得出的就是尽可能少的个数。每个节点都有三种状态,分别表示当前节点不能被监视,当前节点装了摄像头和当前节点可以被监视。下面用图画了一下自己的思路,分别列举了一下节点存在的各种情况,然后对节点孩子节点的 status 进行分析,一些类似的状态就没有画出来,最后总结画出了左下角的图。图中横轴为左子树的状态,纵轴为右子树的状态,根据左右子树的状态可以得出父节点的状态。得出的规律分别是左边黄色框起来的,只要存在一个孩子的 sta.原创 2020-09-22 23:02:49 · 238 阅读 · 0 评论 -
leetcode 章节分类 树 面试题 04.03 特定深度节点链表
将一个二叉树层次遍历,返回一个用数组存储的链表。没什么其他方法,直接上层次遍历代码就行。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *//** * Definition for singly-linke.原创 2020-09-21 23:54:33 · 205 阅读 · 0 评论 -
leetcode 每日一题 538 把二叉搜索树转换为累加树
首先,要知道二叉搜索树。简单来说就是每个节点的左子树的 val 都小于当前节点的 val ,每个右子树的 val 都大于当前节点的 val 。累加树的定义题目已经给出,因为二叉搜索树本身中序遍历就是一个有序的序列,所以反向遍历每次把前一个的数累加到当前的数就是本身加上所有更大数之和。简单的过程如下:利用反中序遍历即可一次性完成所有节点的更新。代码如下:public class lc538 { int count=0; public TreeNode convertBST(Tr.原创 2020-09-21 23:44:27 · 135 阅读 · 0 评论 -
leetcode 每日一题 78 子集
思路:每次都遍历下次可能选取都数字,在每个节点都会将结果存入 ans。代码如下:import java.util.LinkedList;import java.util.List;import java.util.Stack;public class lc78 { List<List<Integer>> ans = new LinkedList<>(); Stack<Integer> stack = new Stack<&.原创 2020-09-20 20:20:12 · 170 阅读 · 0 评论 -
leetcode 每日一题 404 左叶子之和
第一次的解法思路:直接用 bfs 遍历整个树,因为左叶子肯定没有孩子节点,所以每次遍历到某个节点时会判断节点是否有左子树,如果有那么是否有孩子。如果没有,则直接把节点的数加到 ans 中去,如果有就会递归调用左子树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode.原创 2020-09-20 18:56:31 · 183 阅读 · 0 评论