![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode记录
文章平均质量分 69
一群枫子
勿忘初心
展开
-
正则表达式匹配(动态规划实现)
题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 :输入:s = “aa” p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。提示:0 <= s.length <= 200 <= p.length <= 30s 可能为空,且只包含从 a-z 的小写字母。原创 2021-01-14 09:20:50 · 605 阅读 · 2 评论 -
寻找两个正序数组的中位数(二分法 - 第k小数实现)
题目给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3)原创 2021-01-07 17:59:42 · 358 阅读 · 0 评论 -
最长回文子串(动态规划实现)
题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 :输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。注意点1、确定动态规划方程:dp[j][k] - 表示以下标为 j 为开始,以下标为 k 为结束的字符串是否为回文串;2、确定状态转移方程:当字符串长度为0时,返回空字符串“”;当字符串长度为1时,都是回文串;当字符串长度为2时,当两个字符相同时为回文串;当字符串长度大于2时,当头尾两字符相等,且dp[j原创 2020-12-23 17:38:49 · 1357 阅读 · 1 评论 -
寻找旋转排序数组中的最小值(二分法简单实现)
题目假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。请找出其中最小的元素。示例 :输入:nums = [3,4,5,1,2]输出:1提示:1、1 <= nums.length <= 5000;2、-5000 <= nums[i] <= 5000;3、nums 中的所有整数都是 唯一 的;4、nums 原来是一个升序排序的数组,但在预先未知的某个点上进行了旋转。注意点1、原创 2020-12-22 17:56:38 · 181 阅读 · 0 评论 -
乘积最大子数组(优化动态规划空间实现)
题目给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 :输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。注意点1、动态规划思想类似数学中的数学归纳法;2、确定状态方程:max[n]:表示以n为下标为结尾的连续数组的最大乘积;(此处为了优化空间,只是用 max(当前元素)和 preMax(前一元素)记录以该元素结尾的最大乘积)min[n]:表示以n为下标为结尾的连续数组的最小原创 2020-12-18 11:09:26 · 337 阅读 · 0 评论 -
翻转字符串里的单词(简单实现)
题目给定一个字符串,逐个翻转字符串中的每个单词。说明:1、无空格字符构成一个 单词 ;2、输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括;3、如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例 :输入:" hello world! "输出:“world! hello”解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。提示:1、1 <= s.length <= 104;2、s 包含英文大小写字母、数字和空原创 2020-12-17 16:39:07 · 464 阅读 · 0 评论 -
逆波兰表达式求值(栈实现)
题目根据 逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:1、整数除法只保留整数部分。2、给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 :输入: [“2”, “1”, “+”, “3”, “*”]输出: 9解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9逆波兰表达式:1、逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。原创 2020-12-16 15:55:58 · 923 阅读 · 0 评论 -
排序链表(归并排序递归实现)
题目给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。示例 :输入:head = [4,2,1,3]输出:[1,2,3,4]提示:1、链表中节点的数目在范围 [0, 5 * 104] 内;2、-105 <= Node.val <= 105。注意点1、归并排序其实就是使用分治(将问题分(divide)成一些小的问题然后递归求解)的思想来实现排序的,其主要的操作就是将两个已经有序的序列进行合并成一个有序的链表;2、使用分治思想,所以需要寻找中间节点,链表原创 2020-12-11 17:00:49 · 996 阅读 · 0 评论 -
对链表进行插入排序(从前往后遍历简单实现)
题目对链表进行插入排序。插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。示例 :输入: 4->2->1->3输出: 1-&原创 2020-12-10 09:13:34 · 780 阅读 · 0 评论 -
LRU缓存机制(LInkedHashMap实现)
题目运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) :以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) :如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) :如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数原创 2020-12-08 17:37:19 · 378 阅读 · 1 评论 -
二叉树的后序遍历(前序遍历逆序迭代实现)
题目给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3]输出: [3,2,1]进阶: 递归算法很简单,你可以通过迭代算法完成吗?注意点参考:二叉树的前序遍历(迭代实现)1、二叉树后序遍历顺序为:左节点-> 右节点 -> 根节点;2、二叉树前序遍历顺序为:根节点-> 左节点 -> 右节点;3、所以我们可以采用前序遍历的方式,逆序输出后序遍历;4、步骤:1、根节点入栈;2、栈顶节点出栈,并记录到结果中(注意:使用头插法);3、判断出原创 2020-12-04 16:23:36 · 1840 阅读 · 0 评论 -
二叉树的前序遍历(迭代实现)
题目给你二叉树的根节点 root ,返回它节点值的前序遍历。示例 :输入:root = [1,null,2,3]输出:[1,2,3]提示:1、树中节点数目在范围 [0, 100] 内;2、-100 <= Node.val <= 100。进阶:递归算法很简单,你可以通过迭代算法完成吗?注意点1、二叉树前序遍历的顺序为:根节点-> 左节点 -> 右节点(根节点-> 左子树 -> 右子树)2、递归过程其实就是使用系统栈来实现的,所以迭代过程中,我们可以使原创 2020-12-04 12:04:04 · 2381 阅读 · 0 评论 -
重排链表(双向队列实现)
题目给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…注意:你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 :给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.注意点实现/** * Definition for singly-linked list. * public class ListNode { * in原创 2020-12-03 14:36:06 · 249 阅读 · 0 评论 -
环形链表Ⅱ(快慢双指针实现)
题目给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 :输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接原创 2020-11-17 15:53:35 · 166 阅读 · 0 评论 -
单词拆分(动态规划)
题目给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:1、拆分时可以重复使用字典中的单词。2、你可以假设字典中没有重复的单词。示例 :输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。注意点1、动态方程dp[n] :表示前n个字符串是否可以用字典中的单词表示原创 2020-11-16 17:42:40 · 1036 阅读 · 0 评论 -
加油站(贪心思想)
题目在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:1、如果题目有解,该答案即为唯一答案;2、输入数组均为非空数组,且长度相同;3、输入数组中的元素均为非负数。示例 1:输入:gas = [1,2,3,4,5]cost = [3,4,5,1,原创 2020-11-06 17:33:19 · 112 阅读 · 0 评论 -
克隆图(BFS实现)
题目给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。(即使用复制题目中给出得图(深拷贝))class Node {public int val;public List neighbors;}测试用例格式:1、简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示;2、邻接列表 是原创 2020-11-05 16:26:54 · 103 阅读 · 0 评论 -
分割回文串(DFS+回溯+剪枝实现)
题目给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出:[[“aa”,“b”],[“a”,“a”,“b”]]注意点如图:对字符串进行截取,通过使用dfs+回溯的方式遍历出所有可能,然后通过剪枝的方式提升效率。注意:将符合要求的路径(list)添加到结果集时必须使用 list 的值,使用 list 对象会因为回溯而导致数据的变化。实现class Solution { public List<Li原创 2020-10-27 11:31:46 · 201 阅读 · 0 评论 -
被围绕的区域(DFS实现)
题目给定一个二维的矩阵,包含 ‘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’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直原创 2020-10-23 15:11:28 · 156 阅读 · 0 评论 -
单词接龙(BFS实现)
题目给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母;转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0;所有单词具有相同的长度;所有单词只由小写字母组成;字典中不存在重复的单词;你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,endW原创 2020-10-21 17:08:01 · 267 阅读 · 0 评论 -
三角形最小路径和(自上而下动态规划+空间优化)
题目给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。注意点1、自上而下动态规划简单实现获取动原创 2020-10-20 14:53:46 · 318 阅读 · 0 评论 -
填充每一节点的下一个右侧节点指针Ⅱ(BFS链表实现)
题目给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。提示:树中的节点数小于 6000-100 <= node.va原创 2020-10-19 14:27:49 · 67 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针(BFS简单实现)
题目给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。示例:注意点1、获取每一层节点数必须在所有操作之前。实现/*// Definition for a原创 2020-10-19 11:12:41 · 77 阅读 · 0 评论 -
二叉树展开为链表(前序遍历逆序实现)
题目给定一个二叉树,原地将它展开为一个单链表。注意点1、我们发现展开后的链表的顺序为二叉树前序遍历的顺序(根节点->左节点->右节点,1->2->3->4->5->6);2、但我们会发现使用前序遍历的方式进行原地展开时,会丢失右子树(比如遍历到节点2时,需要将节点2作为根节点的右节点,这时会导致右子树丢失);3、所以我们考虑使用前序遍历逆序的方式实现,这样就不会丢失右子树(右节点->左节点->根节点,6<-5<-4<-3&l原创 2020-10-16 11:47:42 · 491 阅读 · 0 评论 -
路径总和Ⅱ(dfs+回溯)
题目给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22注意点注意:在当前节点为叶子节点时,需要删除最后一个节点,因为这里会直接退出递归,不执行后面的回溯。实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left;原创 2020-10-15 17:09:48 · 100 阅读 · 0 评论 -
有序链表转换二叉搜索树(快慢指针+递归实现)
题目给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:注意点1、利用慢指针(一次走一步)和快指针(一次走两步)的特点(当快指针到达尾节点或下一节点为尾节点时,慢指针刚好到达中间节点),得到中间节点;2、将中间节点作原创 2020-10-09 16:07:10 · 134 阅读 · 0 评论 -
从中序与后序遍历序列构造二叉树(递归实现)
题目根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:注意点1、递归思路根据后序遍历确定根节点;(最后一个)然后根据中序遍历确定左子树和右子树;循环以上步骤。参考:从前序与中序遍历序列构造二叉树(递归实现)实现/** * Definition for a binary tree node. * pu原创 2020-09-21 17:27:55 · 1594 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树(递归实现)
题目根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:注意点1、大部分树的遍历和构建都可以使用递归来实现;2、递归思路根据前序遍历确定根节点;然后根据中序遍历确定左子树和右子树;循环以上步骤。实现/** * Definition for a binary tree node. * public cl原创 2020-09-21 16:15:29 · 377 阅读 · 0 评论 -
二叉树的锯齿形层次遍历(BFS实现)
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7]返回其层次遍历结果:注意点参考1:二叉树的层序遍历(BFS实现)参考2:二叉树的层次遍历Ⅱ(BFS实现)1、该题是以上两道题的综合,根据不同情况采取不同的操作;向左遍历,使用尾插法;向右遍历,使用头插法。实现 public List<List<Integer>> zigzagLevelOrde原创 2020-09-18 17:34:37 · 102 阅读 · 0 评论 -
二叉树的层序遍历(BFS实现)
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7]返回其层次遍历结果:注意点1、遍历使用Queue是使用队列FIFO的特点;2、BFS遍历如下图:参考:二叉树的层次遍历Ⅱ(BFS实现)实现 public List<List<Integer>> levelOrder(TreeNode root) { // 存放结果 List原创 2020-09-18 11:04:11 · 653 阅读 · 0 评论 -
验证二叉搜索树(递归实现)
题目给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:1、节点的左子树只包含小于当前节点的数;2、节点的右子树只包含大于当前节点的数;3、所有左子树和右子树自身必须也是二叉搜索树。示例 :输入:输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。注意点1、二叉搜索树是左子树都小于根节点,右子树都大于根节点;而不仅仅是左节点小于根节点,右节点大于根节点;2、所以我们在判断一个节原创 2020-09-17 15:23:50 · 341 阅读 · 0 评论 -
不同的二叉搜索树(递归实现)
题目给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:注意点1、递归问题切记一定不要跳入递归,只从宏观上考虑问题;2、求n个节点的所有二叉搜索树的数量,只需要将以1、2、… n为根节点的所有二叉搜索树的数量相加;3、求以 i 为根节点的所有二叉搜索树的数量 = 左子树的数量 * 右子树的数量左子树节点个数为 i - 1,则为求节点数为 i - 1所有二叉搜索树的数量;右子树节原创 2020-09-16 16:40:21 · 215 阅读 · 0 评论 -
不同的二叉搜索树Ⅱ(动态规划实现)
题目给定一个整数 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、确定状态方程dp(i):代表n = i时,由 1 … n 为节点所组成的所有 二叉搜索树;(本题使用pre表示dp(n - 1),cur表示dp(n))2、确定初始值:当n =原创 2020-09-16 11:26:21 · 130 阅读 · 0 评论 -
二叉树的中序遍历(迭代实现)
题目给定一个二叉树,返回它的中序遍历(先遍历左节点,然后根节点,最后右节点)。示例:输入: [1,null,2,3]12/3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?注意点1、二叉树的迭代就是使用循环的方式实现遍历;2、二叉树中序遍历为:先遍历左节点,然后根节点,最后右节点;3、所以需要寻找到最后一个左节点,并添加到结果中;(该没有左节点,所以也为根节点)4、然后访问右节点。(右节点可能存在左节点和右节点,所以跟根节点的遍历一样处理)实现原创 2020-09-15 16:25:00 · 4014 阅读 · 1 评论 -
复原IP地址(回溯+剪枝实现)
题目给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 :输入:s = “25525511135”输出:[“255.255.11.135”,“2原创 2020-09-14 16:33:52 · 349 阅读 · 2 评论 -
反转链表Ⅱ(迭代实现)
题目反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL注意点1、该题的思路为遍历到m节点的位置;(记得保存m的前驱节点和m节点)2、使用双指针反转m节点到n节点之间的链表;(反转时记得保存下一节点)3、重新组装链表。(记得判断是否从头节点开始反转)实现原创 2020-09-11 16:04:14 · 314 阅读 · 0 评论 -
解码方式(动态规划实现)
题目一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 :输入: “226”输出: 3解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。注意点参考:爬楼梯(动态规划实现)1、定义状态方程:dp[i] 表示以s[i]结尾的解码方式的总数;2、特殊情况:当第一位数位0时,则不存在编码,所以总数为0原创 2020-09-10 16:32:36 · 279 阅读 · 0 评论 -
子集Ⅱ(回溯+剪枝实现)
题目给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]注意点参考:子集(回溯实现)1、该题中存在重复的元素,所以可以在子集(回溯实现)的基础上增加剪枝操作;2、注意剪枝时是使用i > start,不是使用 i > 0。i > start:表示相同层不可以出现相同的数字;( 1, 2, 2’ ]是可原创 2020-09-09 17:47:21 · 174 阅读 · 0 评论 -
格雷编码(公式+动态规划实现)
题目格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。注意:1、格雷编码序列必须以 0 开头;2、当 n = 0 时,其格雷编码序列为 [0]。示例 :输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010原创 2020-09-08 11:44:25 · 960 阅读 · 0 评论 -
分隔链表(空节点+指针实现)
题目给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。注意:你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5注意点1、该题的思路主要是:使用两个头节点分别存放小于x或者大于等于x的值;使用head指针遍历目标链表;使用left和right指针分别记录对应链表(小于x链原创 2020-09-07 17:46:29 · 137 阅读 · 0 评论