![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
Rookie2Master
CSDN is like shit and is no longer used
展开
-
leetcode51. N 皇后
leetcode51. N 皇后八皇后n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例 1:输入:n = 4输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]解释:如上图所示,4 皇后问题存在两原创 2021-09-08 16:25:20 · 331 阅读 · 0 评论 -
leetocde367. 有效的完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。示例 1:输入:num = 16输出:true示例 2:输入:num = 14 输出:false方法1. 利用 1+3+5+7+9+…+(2n-1)=n^2,即完全平方数肯定是前n个连续奇数的和 public boolean isPerfectSquare(int num) { for (int i = 1; n原创 2021-03-21 15:32:52 · 78 阅读 · 0 评论 -
求一个正整数N的开平方(牛顿迭代法)
牛顿迭代法:解法参考:这里 static double helper(int a) { if (n < 2) return 1.0 * a; double x0 = 1; // 先假设一个初始值 double x = x0 / 2 + a / x0 / 2; // 解, 把1-2的式子 = 右边括号展开 while (Math.abs(x - x0) > 0.001) { // 误差范围 x0 = x; x = x0 / 2 + a / x0 / 2; }原创 2020-12-16 20:55:27 · 539 阅读 · 0 评论 -
证明-快慢指针找链表环
快慢指针证明(1)先证明两个指针可以相遇1、如果链表没有环,那么快指针比慢指针先到达尾部**(null)**。2、如果链表有环的话,因为快指针走的比慢指针快,所以在环中相遇的过程可以看作是快指针从环后边追赶慢指针的过程。用递归法证明,快慢指针一定会相遇:(1)快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。(2)快指针与慢指针之间差两步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。(3)快指针与慢指针之间差N步。此时继原创 2020-11-28 11:45:29 · 311 阅读 · 0 评论 -
leetcode94.二叉树非递归遍历(不用栈)
Morris Traversal 线索树时间是O(n) 空间O(1)的解法 :参考:https://blog.csdn.net/dxx707099957/article/details/88550437?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242要使用O(1)空间进行遍历,最大的难点在于,遍历到子节点的时候怎样重新返回到父节点(假设节点中没有指向父节点的p指针),由于不能原创 2020-11-23 16:54:08 · 188 阅读 · 0 评论 -
二叉树非递归遍历访问总结
传送门把原本的递归形式转换成迭代的形式,但是整体的思想还是不变的,其实就是把递归的过程 翻译 成while + if 。LeetCode94.二叉树的中序遍历(非递归)递归过程:找到最左子树遇到p的左节点NULL的递归返回上一层,访问节点p递归p的右节点方法1. public List<Integer> inorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<&原创 2020-11-15 16:46:04 · 222 阅读 · 0 评论 -
LeetCode回文问题总结,回文子串,回文子序列等
1. LeetCode 5. 最长回文子串(求长度)传送门题目: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。输入: “babad”输出: “bab” 注意: “aba” 也是一个有效答案。假设字符串s的长度为length,建立一个length*length的矩阵dp。令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串。当 i == j,dp[i][j] 是回文子串(单字符都是回文子串);当 j -原创 2020-11-05 09:41:01 · 749 阅读 · 0 评论 -
leetcode201. 数字范围按位与
传送门题目:给定范围 [m, n], 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。输入: [5,7] 输出: 4输入: [0,1] 输出: 0找这些数字的公共前缀,进一步可以转换成最小和最大两个数的公共前缀。为什么只用 选取最大和最小两个数 ?因为最大和最小两个数之间,其他数字,会将公共前缀后的所有位,0与1都会取到而可能第二个最小的数进位后,和最大的数的公共前缀,比最小数和最大数的公共前缀不原创 2020-11-02 18:55:52 · 194 阅读 · 0 评论 -
leetcode199. 二叉树的右视图
传送门题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1, 3, 4] 1 <--- / \2 3 <--- \ \ 5 4 <---思路:我们对树进行深度优先搜索,在搜索过程中,我们总是先访问右子树。那么对于每一层来说,我们在这层见到的第一个结点一定是最右边的结点。算法:这原创 2020-09-10 14:19:19 · 188 阅读 · 0 评论 -
leetcode187. 重复的DNA序列
传送门题目:所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来查找目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”输出:[“AAAAACCCCC”, “CCCCCAAAAA”]方法1. hash存遍历的每一个字串 public List<Strin原创 2020-09-10 11:45:20 · 281 阅读 · 0 评论 -
leetcode173. 二叉搜索树迭代器
传送门实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。调用 next() 将返回二叉搜索树中的下一个最小的数。next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数。用自己的栈加上简单迭代的方式遍历树。其中栈顶是当前的答案节点。其中要用到辅助函数findMin(root):将给定节点中的所有左子节点添加到栈中,直原创 2020-09-10 11:40:59 · 86 阅读 · 0 评论 -
leetcode171&168 Excel表列转换总结
171. Excel表列序号题目: 给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...输入: “A”输出: 1示例 2:输入: “AB”输出: 28示例 3:输入: “ZY”输出: 701本题和168是逆过程因为从1开始 没有0 : 满27进1 但是基数是26 public int titleToNumber(Strin原创 2020-09-10 11:39:40 · 146 阅读 · 0 评论 -
leetcode165. 比较版本号
传送门题目:比较两个版本号 version1 和 version2。如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和 . 字符。. 字符不代表小数点,而是用于分隔数字序列。输入: version1 = “0.1”, version2 = “1.1” 输出: -1输入: version1 = “1.0.1”, version2 = “1”原创 2020-09-10 11:37:23 · 113 阅读 · 0 评论 -
leetcode151. 翻转字符串里的单词
传送门输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面或单词中间包含多余的空格,但是反转后的字符不能有多余空格。 public String reverseWords(String s) { Stack<String> stk = new Stack<>(); int start = 0, end = s.length() - 1; while (原创 2020-09-10 11:36:27 · 93 阅读 · 0 评论 -
leetcode147. 对链表进行插入排序
传送门输入: 4->2->1->3输出: 1->2->3->4关键是几个链表节点的作用:dummy指向第一个节点,一是用于结果输出,二是寻找插入位置时用于回到起点cur用于遍历的节点pre是cur的前驱,同时也是当前已排序链表尾节点。因为每次插入一次之后,pre都会指向下一个遍历节点临时节点p: cur应该插入的位置的前驱,p每次从dummy开始遍历,但是注意: p是取的p.next的val和cur比较的(要不然没办法把插入前一个位置next置位)原创 2020-09-10 11:35:03 · 82 阅读 · 0 评论 -
leetcode144. 二叉树的前序遍历(迭代法)
传送门题目:给定一个二叉树,返回它的 前序 遍历。 用迭代法 public List<Integer> preorderTraversal(TreeNode root) { LinkedList<Integer> ans = new LinkedList<>(); if (root == null) return ans; Stack<TreeNode> stk = new Stack<>();原创 2020-09-10 11:33:38 · 173 阅读 · 0 评论 -
leetcode143. 重排链表
传送门题目:给定一个单链表 L:L0→L1→…→Ln-1→Ln 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定链表 1->2->3->4, 重新排列为 1->4->2->3.给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.用快慢指针把链表分成两半,把后半段倒序,然后后半段按顺序插入前半原创 2020-09-10 11:25:49 · 131 阅读 · 1 评论 -
leetcode137. 只出现一次的数字 II
传送门题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?输入: [2,2,3,2]输出: 3方法1. 统计每位二进制数字出现的次数进行 %3 public int singleNumber(int[] nums) { int[] bitSum = new int[32]; for (int num : nums) {原创 2020-09-10 11:24:26 · 158 阅读 · 0 评论 -
leetcode133. 克隆图(图的遍历)
传送门题目:给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。给定节点将始终是图中原创 2020-09-07 17:18:57 · 132 阅读 · 0 评论 -
leetcode129. 求根到叶子节点数字之和
传送门题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。输入: [1,2,3] 1 / \ 2 3输出: 25从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.1. 回溯, 用列表存每个路径和,太麻烦了:原创 2020-09-07 17:17:14 · 105 阅读 · 0 评论 -
leetcode119. 杨辉三角 II
传送门题目:给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行输入: 3输出: [1,3,3,1]列优化的动态规划,注意列优化后的列遍历方向 public List<Integer> getRow(int k) { List<Integer> ans = new ArrayList<>(); int[] dp = new int[k + 1]; for (int i = 0; i <= k原创 2020-09-07 17:14:36 · 100 阅读 · 0 评论 -
leetcode113. 路径总和 II
传送门题目:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \7 2 5 1返回:[[5,4,11,2],[5,8,4,5]] public List<List<Integer>> pathSum(TreeN原创 2020-09-07 17:13:40 · 80 阅读 · 0 评论 -
leetcode112. 路径总和
传送门题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 public boolean hasPathSum(TreeNode原创 2020-09-07 17:12:18 · 97 阅读 · 0 评论 -
leetcode111. 二叉树的最小深度
传送门题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2. public int minDepth(TreeNode root) { if (root == null) return 0; int l = minDepth(root.left);原创 2020-09-07 17:11:07 · 201 阅读 · 0 评论 -
leetcode110. 平衡二叉树(判断是不是)
传送门题目:给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。方法1. 自顶向下 (重复递归) public boolean isBalanced(TreeNode root) { if (root == null) return true; // 后根遍历 boolean isLeftBanlanced = isBalanced(root.left);原创 2020-09-06 20:44:03 · 133 阅读 · 0 评论 -
??leetcode109. 有序链表转换二叉搜索树
传送门题目:给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5基于解决这个问题的中序遍历的思想:我们知道中序遍历最左边的元素一定是给定原创 2020-09-06 20:42:08 · 139 阅读 · 0 评论 -
leetcode107. 二叉树的层次遍历 II
传送门题目:给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[[15,7],[9,20],[3]]方法1. 常规层次遍历,额外变量存储每层节点数public List<List<Integer>> levelOrderBottom(Tre原创 2020-09-06 18:32:50 · 127 阅读 · 0 评论 -
leetcode100. 相同的树
传送门题目:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: truepublic boolean isSameTree(TreeNode p, TreeNode q) { if (p == null &&a原创 2020-09-06 18:31:22 · 66 阅读 · 0 评论 -
leetcode93. 复原IP地址
传送门题目:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。输入: “25525511135”输出: [“255.255.11.135”, “255.255.111.35”]分析剪枝条件:1、一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址(这一点可以一般化到中间结点的判断中,以产生剪枝行为);2、每一个结点可以选择截取的方法只有 3 种:原创 2020-09-06 18:30:11 · 162 阅读 · 0 评论 -
leetcode92. 反转链表 II
传送门题目:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 1 ≤ m ≤ n ≤ 链表长度。输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL方法1. 递归 // 要反转的子链表的后驱,在反转链表那道题里nextNode是一直是null ListNode nextNode = null; public ListNode reverse原创 2020-09-06 18:28:40 · 80 阅读 · 0 评论 -
leetcode86. 分隔链表
传送门题目:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5两个冗余头结点,分别存比<x的节点和>=x的节点 public ListNode partition(ListNode head, int x) {原创 2020-09-05 19:14:52 · 89 阅读 · 0 评论 -
leetcode83&82删除排序链表中的重复元素
leetcode83. 删除排序链表中的重复元素题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。输入: 1->1->2输出: 1->2 public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) return head; ListNode pre = head, cur = head.next;原创 2020-09-05 19:13:50 · 103 阅读 · 0 评论 -
leetcode77. 组合
传送门题目:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]最基本的回溯问题,限制条件只有 当前path的元素个数是不是k public List<List<Integer>> combine(int n, int k) { List<List<Integer>> ans = n原创 2020-09-05 19:11:45 · 105 阅读 · 0 评论 -
leetcode71. 简化路径
传送门题目:以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。示例 1:输入:"/home/"输出:"/home"原创 2020-09-05 19:10:36 · 114 阅读 · 0 评论 -
leetcode67. 二进制求和
传送门题目:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。输入: a = “11”, b = “1”输出: “100”实现方法很好!! 学学人家的简洁写法!!!! public String addBinary(String a, String b) { if (a.charAt(0) == '0') return b; if (b.charAt(0) == '0') return a;原创 2020-09-05 19:06:50 · 79 阅读 · 0 评论 -
leetcode58. 最后一个单词的长度
传送门题目:给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:单词是指仅由字母组成、不包含任何空格字符的字符串。输入: “Hello World” 输出: 5 public int lengthOfLastWord(String s) { int j = s.length() - 1; while (j &g原创 2020-09-05 19:05:41 · 84 阅读 · 0 评论 -
leetcode24. 两两交换链表中的节点
传送门题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3. public ListNode swapPairs(ListNode head) { // 这里两个判断,就会保证链表长为奇数时,最后一个节点直接返回,不会和前面的交换 if (head == null || head.next原创 2020-09-05 19:04:40 · 79 阅读 · 0 评论 -
leetcode12. 整数转罗马数字
传送门题目:给定一个整数,将其转为罗马数字歧义处理如果你不熟悉罗马数字,有一件事会让你有点困惑,那就是知道哪种表示法是一个特定整数的“正确”表示法。例如,考虑 140 表示的可能方法。哪一个是正确的?我们用来决定的规则是从左到右选择尽可能大的符号表示。例如,上面以最大符号开头的表示法是以 C 开头的表示法。为了决定使用哪一个表示法,我们看下一个符号。其中两个为 X 值 10,一个 XL 值 40。因为 XL 更大,所以我们采用这种表示法。因此,140 的表示是 CXL。将给定的整数转换为罗马原创 2020-09-05 11:19:52 · 78 阅读 · 0 评论 -
leetcode6. Z 字形变换
传送门题目:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。输入: s = “LEETCODEISHIRING”, numRows = 4输出: “LDREOEIIECIHNTSG”解释:L D RE O E I IE C I H NT S G找规律例如对一个4行的0 6 12 181 5 7 11 13 172 4 8 10 14 163 9原创 2020-09-05 10:17:46 · 80 阅读 · 0 评论 -
leetcode698. 划分为k个相等的子集
传送门题目:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 输出: True说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。这种找子集的题,先求和,然后除以子集个数,得到每一部分的子集和,然后凑子集和 int[] bucket; // 放k的子集的和 public boolean canP原创 2020-09-03 17:37:12 · 673 阅读 · 0 评论