力扣
力扣做题记录
zzxdddd
这个作者很懒,什么都没留下…
展开
-
95. 不同的二叉搜索树 II,动态规划
不同的二叉搜索树 II给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 .原创 2020-07-24 18:34:16 · 129 阅读 · 0 评论 -
力扣,第199题 二叉树的右视图,bfs,dfs
二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ 2 3 <—\ 5 4 <—思路,bfs就是每层最后一个结点dfs 前序遍历,不过是根右左,每层访问的第一个数,添加进去class Solution {public: vecto.原创 2020-07-24 12:37:43 · 134 阅读 · 0 评论 -
397.整数替换,记忆化递归,位运算
整数替换给定一个正整数 n,你可以做如下操作:如果 n 是偶数,则用 n / 2替换 n。如果 n 是奇数,则可以用 n + 1或n - 1替换 n。n 变为 1 所需的最小替换次数是多少?示例 1:输入:8输出:3解释:8 -> 4 -> 2 -> 1class Solution {public: unordered_map<int, int> hash; int integerReplacement(int n) { if (n =.原创 2020-07-22 23:00:53 · 156 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置,二分查找
在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]二分查找统一闭区间的写法:.原创 2020-07-22 10:58:13 · 96 阅读 · 0 评论 -
力扣第51题,N皇后,BFS+回溯
N皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4 皇后问.原创 2020-07-20 23:01:14 · 325 阅读 · 0 评论 -
力扣第52题,N皇后II,dfs+回溯剪枝
N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回 n 皇后不同的解决方案的数量。示例:输入: 4输出: 2解释: 4 皇后问题存在如下两个不同的解法。[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]题意:N*N的棋盘上,放n个皇后,使每个皇后在不同行,不同列,不在同一条.原创 2020-07-20 22:58:14 · 234 阅读 · 0 评论 -
力扣第126题单词接龙II,bfs
单词接龙 II给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord.原创 2020-07-20 17:54:20 · 260 阅读 · 0 评论 -
力扣127题单词接龙,bfs
单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,en.原创 2020-07-19 18:20:17 · 194 阅读 · 0 评论 -
力扣第106题,从中序和后序构造二叉树
class Solution {public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { unordered_map<int, int> map; for (int i = 0; i < inorder.size(); i++) { map.insert(make_pair(inorder[i], i)); } //范围是左原创 2020-07-18 10:32:19 · 208 阅读 · 0 评论 -
力扣第105题,从前序和中序构造二叉树
思路:参数:前序序列,中序序列,和两个序列的范围,表示这个树所有结点根据前序,可以知道开始位置就是根结点,然后再中序里面寻找根结点的位置,记住位置root_pos,根结点左边的都是左子树结点,左子树结点个数left_Num=root_pos - in_start;TreeNode *root= new TreeNode(pre[p_start])递归建立左子树 前序序列的左子树范围就是pre_start+1~pre_start+1+leftNum中序序列的左子树范围就是in_start~root原创 2020-07-17 23:18:24 · 171 阅读 · 0 评论 -
力扣第98题,验证二叉搜索树,dfs
验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。思路:两个方法方法1:二叉搜.原创 2020-07-17 23:00:12 · 192 阅读 · 0 评论 -
力扣第213题,打家劫舍II,动态规划
打家劫舍 II你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2,3,2]输出: 3解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的.原创 2020-07-17 12:49:53 · 208 阅读 · 0 评论 -
5.最长回文子串,动态规划
最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路:f(i,j)代表从第i个字符到第j个字符形成的字符串是否是回文串边界:长度为1的字符串f(i,i)=1长度为2的直接比较两个字符串是否相同f(i,j)=f(i+1,j-1)&&s[i]s[j] 下一个串等于 长度减少.原创 2020-07-17 12:32:07 · 81 阅读 · 0 评论 -
力扣第198,打家劫舍,动态规划
打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2.原创 2020-07-15 20:29:43 · 75 阅读 · 0 评论 -
力扣第63题不同的路径II,动态规划
不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。从.原创 2020-07-15 19:52:55 · 265 阅读 · 0 评论 -
力扣第62题,不同路径,动态规划
不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -> 向下 -> 向右向下 -> 向右.原创 2020-07-15 19:46:51 · 235 阅读 · 0 评论 -
力扣第12题整数转罗马数字
package _12整数转罗马数字;import javax.jws.soap.SOAPBinding;public class Solution { public static void main(String[] args) { System.out.println(new Solution().intToRoman(2782)); } public String intToRoman(int num) { //存放位置原创 2020-07-06 13:51:09 · 155 阅读 · 0 评论 -
1498. 满足条件的子序列数目
满足条件的子序列数目给你一个整数数组 nums 和一个整数 target 。请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。由于答案可能很大,请将结果对 10^9 + 7 取余后返回。示例 1:输入:nums = [3,5,6,7], target = 9输出:4解释:有 4 个子序列满足该条件。[3] -> 最小元素 + 最大元素 <= target (3 + 3 <= 9)[3,5] -> (3.原创 2020-06-29 23:40:14 · 271 阅读 · 0 评论 -
1497检查数组对是否可以被k整除
1497.检查数组对是否可以被k整除给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。如果存在这样的分法,请返回 True ;否则,返回 False 。示例 1:输入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5输出:true解释:划分后的数字对为 (1,9),(2,8),(3,7),(4,6) 以及 (5,10)思路:错误想法,找到两个之和整除,这样可能找不全正原创 2020-06-29 23:25:35 · 296 阅读 · 0 评论 -
面试题16_18模式匹配
模式匹配难度:中等标签:字符串你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。示例 1:输入: pattern = “abba”, value = “dogca原创 2020-06-25 17:49:55 · 121 阅读 · 0 评论 -
力扣第124题二叉树的最大路径和
124.二叉树的最大路径和难度:困难标签:二叉树,深度优先搜索给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3]1/ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7]-10/ 9 20/ 15 7输出:42public class Solution2 { int maxSum = Int原创 2020-06-22 14:09:37 · 402 阅读 · 0 评论 -
力扣172题阶乘后的零
172.阶乘后的零难度:简单标签:数学给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.思路:直接算阶乘的结果,然后一直除以10,来计算0的个数显然是行不通的我们发现,0的个数,就是因子中的2*5的对数,由于2的个数比5的个数要多得多.所有我们只需要关注5的个数,例如30! 含5的因子有,5,10,15,20,25,30.5含一个,原创 2020-06-17 11:30:38 · 162 阅读 · 0 评论 -
力扣第160题相交链表
160.相交链表难度:简单标签:链表,双指针思路:两个链表有交点.两个链表的长度可能不一样,但两个链表有相同的部分,不同的部分只是交点之前的结点,我们只需要让两个链表同时走,当一个链表走到头的时候,就接着让他走另一条链表的路,当他们相遇时,就是交点,因为他们走的长度都是他们自身长度加对方结点之前的长度public ListNode getIntersectionNode(ListNode headA, ListNode headB){ ListNode A=headA; ListNo原创 2020-06-16 17:44:50 · 235 阅读 · 0 评论 -
力扣第103题二叉树的锯齿形层次遍历
103.二叉树的锯齿形层次遍历难度:中等标签:树,BFS给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7结果:[[3],[20,9],[15,7]]思路:层次遍历有三种能够记录层数的办法,分隔符(例如使用在每层结束的后面加上一个空结点),然后每层从做向右,或者从右向左第二个就是,记录队列的大小,然后遍历原创 2020-06-15 20:10:06 · 211 阅读 · 0 评论 -
力扣第179题最大数
179.最大数难度:中等标签:排序给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例 2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数思路:将每个数字转换为字符串,然后进行排序,合并起来大的,排在前面,public String largestNumber(int[] nums){ if(nums==null) return null;原创 2020-06-12 13:41:58 · 305 阅读 · 0 评论 -
力扣第56题合并区间
56.合并区间难度:中等标签:数组,排序给出一个区间的集合,请合并所有重叠的区间。class cmp implements Comparator{ @Override public int compare(Object o1, Object o2) { int[] a= (int[]) o1; int[] b=(int[]) o2; return a[0]-b[0]; }}public int[][] merge(int[原创 2020-06-11 19:06:21 · 246 阅读 · 0 评论 -
力扣第148题排序链表
148.排序链表难度:中等标签:归并排序,链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5**思路:**有时间和空间要求,只能从底到顶的归并排序每次找两个部分合并,直到长度超过链表长度,还是归并排序的思路只是要找两个部分合并,原创 2020-06-11 16:59:35 · 206 阅读 · 0 评论 -
力扣第130题被围绕的区域
130.被围绕的区域难度:中等标签:深度优先,广度优先,并查集给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’原创 2020-06-05 14:46:29 · 338 阅读 · 0 评论 -
力扣第128题最长的连续序列
128.最长连续序列难度:困难标签:并查集给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。思路:运用并查集,使用hashmap fatherset key是数组的值,value是key的父结点初始化时,一共n个树。还有一个hashmap size 放的是每棵树的大小结点个数遍历数组,然后把判断nums[i]-1是原创 2020-06-05 12:32:08 · 344 阅读 · 0 评论 -
力扣第92题反转链表II
92.反转链表II难度:中等标签:链表反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULLpublic ListNode reverseBetween(ListNode head, int m, int n) { if(head==null||head.n原创 2020-06-04 09:46:23 · 326 阅读 · 1 评论 -
力扣第82题删除排序链表中的重复元素II
82.删除排序链表中的重复元素II难度:中等标签:链表给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3public ListNode deleteDuplicates(ListNode head) { //为空或者只有一个结点原创 2020-06-04 09:08:11 · 273 阅读 · 0 评论 -
力扣第24题两两交换链表中的结点
24.两两交换链表中的结点难度:中等标签:链表给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.思路:头插,弄个头结点,然后插完一次,头结点后移public ListNode swapPairs(ListNode head){ if(head==null||head.next==null) return hea原创 2020-06-03 18:38:47 · 204 阅读 · 0 评论 -
力扣第23题合并k个排序链表
23.合并k个排序链表难度:困难标签:堆,链表,分治合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6思路1.:使用堆,将k个链表中的元素,放入堆中,每次取出堆顶元素也就是最小的元素,最后注意要把最后一个顶点的next置为nullpublic ListNode mergeKLists(原创 2020-06-03 18:34:46 · 171 阅读 · 0 评论 -
力扣第25题k个一组翻转链表
25.k个一组翻转链表难度:困难标签:链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5说明:你的算法只能使用常数的额外空间原创 2020-06-03 17:44:54 · 160 阅读 · 0 评论 -
力扣第78题子集
78.子集难度:中等标签:回溯算法给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]思路:这里是求子集,每添加一个数进去就是一个子集,和原来集合相同的子集需要单独添加进去.public class Solution { boolean flag; public sta原创 2020-05-31 20:49:10 · 461 阅读 · 0 评论 -
力扣第47题全排列II
47.全排列给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]思路:主要思路和全排列一样,还是回溯但是多了去重,先排序为了去重,这一项和前一项相同的话并且前一项刚刚退回来,标志从访问变为未访问public List<List<Integer>> permuteUnique(int[] nums){ List<List<Integer>>原创 2020-05-31 18:52:37 · 228 阅读 · 0 评论 -
力扣第40题组合总和II
40.组合总和难度:中等标签:回溯算法给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合...原创 2020-05-31 16:06:30 · 170 阅读 · 0 评论 -
力扣第39题组合总和
39. 组合总和难度:中等标签:回溯算法给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]...原创 2020-05-31 00:27:25 · 203 阅读 · 0 评论 -
力扣第680题验证回文串II
680.验证回文串II难度:简单标签:双指针,字符串给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: “aba”输出: True示例 2:输入: “abca”输出: True解释: 你可以删除c字符注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。思路:两个指针,一个在头,一个在尾,left,right如果相同两个指针同时往中间走如果出现了不同,删除一个字符,继续走的情况有两种一个是左边不删,删右边,如果左边和右边的原创 2020-05-21 18:27:50 · 261 阅读 · 0 评论 -
力扣第209题长度最小的子数组
209.长度最小的子数组难度:中等标签:双指针,二分查找给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。示例:输入: s = 7, nums = [2,3,1,2,4,3]输出: 2解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。思路:1.双指针,一个快指针,一个慢指针,当两个指针之间的数的和小于目标值,快指针就后移同时加上下一个数,当和目标值大于等于目标值的时候原创 2020-05-19 20:26:58 · 265 阅读 · 0 评论