- 博客(52)
- 收藏
- 关注
原创 tree 337_979
337. House Robber III一个小偷进入一个小区偷东西,小区是一个二叉树,只有一个入口,即root,不能偷任何相邻的两个房子,每个房子可以偷的金钱不一,要求偷的金额最大。后序遍历每个结点,获取当前结点左子树的结果和右子树的结果,进行相加获得sum1当前结点如果存在左右子结点,就获取它左孩子的左右子树的结果之和,右孩子的左右子树的结果之和,将他们相加再与该结点值相加获得sum2比较sum1和sum2,将较大值作为以当前结点为根结点的结果进行返回但是这样会很慢,因为有很多的重复计算通
2020-08-06 01:17:14
129
原创 tree 543_687_968
543. Diameter of Binary Tree给一个二叉树,求最长路径的长度。就是遍历二叉树时对每个结点获取左子树的最大长度和右子树的最大长度,相加后和当前最大值比较。但是helper返回值是左右子树中较长的那一个,然后要注意长度是边数,所以有些许不同:int max = 0;public int diameterOfBinaryTree(TreeNode root) { helper(root); return max;}public int helper(Tree
2020-08-04 18:06:35
118
原创 tree 508_124
508. Most Frequent Subtree Sum给一个二叉树,找到最大频率的子树和。使用后序遍历计算每个子树和,并且用一个map记录所有子树和出现的频率,并用一个max记录最大频率,最后遍历map找到所有value等于max的key:public int[] findFrequentTreeSum(TreeNode root) { helper(root); for (Integer key : map.keySet()) { if (map.ge
2020-08-04 09:26:09
116
原创 序列号与反序列化 297_449
297. Serialize and Deserialize Binary Tree对一颗二叉树实现序列化与反序列化。通过前序遍历二叉树,将所有结点中的值加入字符串中,对于null,加入*字符反序列化也是递归的方法,把字符串转换为一个字符串队列,可以简化反序列化从队列中推出一个字符串,如果不是*,就创建一个结,如果是*,就返回null结点。然后以剩下的队列作为参数创建一个子树作为该结点的左子树,同理构建右子树,直到队列中没有字符串。例:12**34**5**public class Co
2020-08-02 18:22:44
241
原创 tree 129_257_236_235
129. Sum Root to Leaf Numbers求所有从根结点到叶子结点路径上结点所组成的数字的和。简单int res = 0;public int sumNumbers(TreeNode root) { helper(root, 0); return res;}public void helper(TreeNode root, int path) { if (root == null) return; path = path * 10 + roo
2020-08-01 17:06:41
92
原创 tree 112_113_437
112. Path Sum给一颗二叉树和一个数,如果有一条从根到叶子结点和等于sum的的路径就返回true。非常简单,不说了:int res = 0;public boolean hasPathSum(TreeNode root, int sum) { if (root == null) return false; if (root.left == null && root.right == null && res + root.val == sum
2020-07-31 15:15:10
97
原创 tree
669. Trim a Binary Search Tree给一颗bst和一个范围,将bst中所有不在范围内的结点删除。public TreeNode trimBST(TreeNode root, int L, int R) { if (root == null) return null; if (root.val <= R && root.val >= L) { root.left = trimBST(root.left, L, R);
2020-07-30 16:26:23
64
原创 tree 102_107_872
102. Binary Tree Level Order Traversal层序遍历二叉树,返回每一层的结点数,每一层放在一个列表中。用递归法要记住在所层数:public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return res; helper(root, 0); return res;}List<List<Integer>> r
2020-07-29 23:40:28
77
原创 tree 572_965
572. Subtree of Another Tree判断一棵树是否是另一棵的子树。对一棵树进行前序遍历,每到一个结点和另一棵树比较看是否相同:public boolean isSubtree(TreeNode s, TreeNode t) { if (s == null && t == null) return true; if (s == null || t == null) return false; if (isSame(s, t))
2020-07-29 17:46:28
72
原创 tree 100_101_104_110_111
都是比较简单的题100. Same Tree判断两个树是否相同。同时前序遍历两棵树:public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true; else if (p == null || q == null) return false; if (p.val != q.val) return false; ret
2020-07-28 00:39:48
147
原创 tree 429_589_590_1302
这几道都很简单,都可以用递归或队列迭代的方法429. N-ary Tree Level Order Traversal将n叉树每层作为一个数组,返回所以层。使用队列迭代法很容易想出来,但其实也可以使用递归法,就是记录递归进入的每一层的高度,然后将该层每个数字加入对应列表中:public List<List<Integer>> levelOrder(Node root) { List<List<Integer>> res = new ArrayL
2020-07-25 21:02:34
88
原创 tree 94_144_145
不使用递归方法返回二叉树的前中后序遍历数组94. Binary Tree Preorder Traversal用栈,从根结点开始将每次访问到的结点加入返回队列并加入栈中,然后对该结点的左子结点循环上述步骤,只到没有左子结点后,从栈中弹出一个结点,并开始访问该结点的右子树,设立p结点的目的就是为了在循环过程中跳过已经访问过的结点:public List<Integer> preorderTraversal(TreeNode root) { List<Integer> re
2020-07-24 14:09:08
55
原创 BST 450_501
450. Delete Node in a BST给一个bst根结点和一个整数val,删除bst中等于val的结点。从根结点开始遍历,如果val等于当前结点就将当前结点右子树中最左边的元素和当前结点替换,然后再递归进入右子树删除最左边的结点如果val小于当前结点,递归进入左子树继续如果val大于当前结点,递归进入右子树继续public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return null
2020-07-24 12:59:03
74
原创 BST 108_99
108、用有序数组构建BST给一个已排序的数组,构建一个BST,返回根结点。if nums is empty, return null;if nums has only one element, create a TreeNode and return it;else, use the middle element of nums to create a TreeNode as root,3.1. recursive the array on middle left and set it’s r
2020-07-23 10:06:13
210
原创 BST 700_701
700、在BST中找到一个子树给一个根结点和一个数val,在BST中找到等于val的结点,然后返回以这个结点为根结点的子树。可以用递归或迭代,差不多,这里用递归,从根结点搜索等于val的结点,找到时返回该结点。这里主要返回值可能会写错:public TreeNode searchBST(TreeNode root, int val) { if (root == null || root.val == val) return root; else { if
2020-07-21 21:46:55
96
原创 BST98_530
98、验证是否是一个BST给一个根结点,验证这个树是否是一个BST。两种方法:中序遍历一遍,看每一个数是否比后一个数大前序遍历二叉树,如果当前结点比所有左边结点大,比右边节点小就返回true,关键点在于记录每个结点的左界限和右界限//第一种方法Integer last = null;Boolean res = true;public boolean isValidBST(TreeNode root) { help(root); return res;}public
2020-07-21 21:30:21
80
原创 划分字符串回溯leetcode题842_282
842. Split Array into Fibonacci Sequence给一个只有数字的字符串,将它划分成多个子字符串,并且成斐波那契数列。每个数字不能以0开头,除了0本身。Input: “11235813”Output: [1,1,2,3,5,8,13]用回溯法,关键点是子字符串可能很长所以转化成long型,并且去掉大于最大值的数当列表中数字少于两个时特殊处理,我的方法是设置成负数每个数字不能以0开头,所以可以剪枝一下最后是在前两个数字还没有确定时,当剩余子字符串的位数少于前
2020-06-02 20:34:10
116
原创 partition搜索leetcode131_241
131. Palindrome Partitioning给一个字符串,将其划分为多个子字符串并且每个子字符串都是回文字,问有几种划分方法。Input: “aab”Output:[ [“aa”,“b”],[“a”,“a”,“b”] ]很直觉的想法就是进行遍历,对找到的回文字子字符串进行记录,然后回溯加上后面的字符在判断是否是回文字串:/*** 时间复杂度:O(n*(2^n))*/public List<List<String>> partition(String
2020-05-29 20:10:38
121
原创 !partition回溯搜索leetcode93_698
93. Restore IP Addresses给一个数字组成的字符串,按照IP地址的格式返回所有可能的形式。Input: “25525511135”Output: [“255.255.11.135”, “255.255.111.35”]用DFS算法,不过关键点循环次数最多是3:public List<String> restoreIpAddresses(String s) { help(s, 0, new ArrayList<>(), new StringBu
2020-05-28 17:10:11
90
原创 双端bfs搜索752
752. Open the Lock破解一个由4位数字组成的锁,数字从0-9,可以顺着转,也可以反着转,从0000开始,求找到密码所转动的最小次数,同时要避开死锁。死锁是每个元素都是4位数组成的数组。Input: deadends = [“0201”,“0101”,“0102”,“1212”,“2002”], target = “0202”Output: 6Explanation:A sequence of valid moves would be “0000” -> “1000” -&g
2020-05-25 23:51:51
630
原创 两道二维数组bfs算法题542_934
542. 01 Matrix给一个由0和1组成的矩阵,返回每个元素离最近的0元素的距离。Input:[[0,0,0],[0,1,0],[1,1,1]]Output:[[0,0,0],[0,1,0],[1,2,1]]使用bfs算法,先将所有的0点加入队列中,所有的1点设为最大值从每个0点处开始,将附近的点改变(+1)再将这些改变过的点加入队列中,进一步改变他们周围的点就是从最小的点开始,逐步改变其周围的点,像火焰灼烧草地一样扩散开,问题就是有点慢,可以用dp算法优化publ
2020-05-25 22:47:36
454
原创 两道使用bfs的leetcode题126_127
126. Word Ladder II给一个开始单词和一个结尾单词和一个字符串数组,使用数组中的作为候选字符串,每次只改变字符串的一个字符,直到从开始单词转变为结尾单词,找出所有最短的转化单词的路径。Input:beginWord = “hit”,endWord = “cog”,wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]Output:[ [“hit”,“hot”,“dot”,“dog”,“cog”],[“hit”,“hot”,“lot”
2020-05-24 18:17:36
131
原创 字符串搜索dfs题79_208_212
79. Word Search给一个二维字符数组和一个字符串,判断是否存在一条路径使得路径字符等于所给字符串。board =[ [‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]]Given word = “ABCCED”, return true.Given word = “SEE”, return true.Given word = “ABCB”, return false.从数组中每个字符处开始进行递归,看是否存在一个合法路
2020-05-20 21:18:15
328
原创 N皇后问题51_52
51. N-Queens给n x n棋盘,求有多少种n个皇后互相不攻击的摆法,处于同一条竖线,横线对角线的皇后可以攻击到对方。使用dfs遍历,逐行进行尝试,找到合适位置就取下一行继续,没有的话就回溯到上一行重新找个位置,主要是这题格式比较烦人:public List<List<String>> solveNQueens(int n) { char[][] chess = new char[n][n]; for (int i = 0; i < n; i++)
2020-05-17 17:03:13
163
原创 两道括号相关的leetcode题22_301
22. Generate Parentheses写出n对括号的所有合法形式。For example, given n = 3, a solution set is:[ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]回溯求解,不过要单独统计左括号和右括号个数,同时加入左括号和加入右括号是平行的关系,不是if else,这样在回溯时才能加入右括号:public List<String> generateParenthesis
2020-05-16 15:53:19
104
原创 两道有点难的回溯利口题996_37
996. Number of Squareful Arrays给一个不含负数的整数数组,问有多少种排列组合使数组可开方的。一个数组是可开方的意思是数组中每两个相邻数之和都是可开方的。Input: [1,17,8]Output: 2Explanation:[1,8,17] and [17,8,1] are the valid permutations.tags:回溯,排列组合首先这个题目编号让人心头一紧,然后开始解题,依旧是无敌的回溯法解决:和前面的46题很像,不过是多做了点处理每次遍
2020-05-15 15:18:14
139
原创 3道回溯排列题46_47_784
46. Permutations给一个数组,返回其所有排列组合情况。Input: [1,2,3]Output:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]和前面回溯不一样的是,每个解的长度是固定的,在回溯时需要访问所有的元素,看哪个还没有使用,所以用了一个used数组来记录:public List<List<Integer>> permute(int[] nums) { boolea
2020-05-10 15:06:47
65
原创 五道回溯找组合题40_77_78_90_216
这几题挺相似的,解法大同小异40. Combination Sum II从一个数组中找到所有和等于target的子数组,数组中可能含有重复元素,每个元素只能使用一次。Input: candidates = [2,5,2,1,2], target = 5, A solution set is:[ [1,2,2], [5] ]39题进阶版,就是可能包含重复元素而已,解法几乎一样,只要在递归回溯时判断一个下一个元素和当前元素是否相同即可,若相同跳过:public List<List<I
2020-05-09 11:05:02
85
原创 两道回溯法17_39
17. Letter Combinations of a Phone Number给一串数字,获得按照手机键盘上对应的字母的所有组合。Input: “23”Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].用回溯法:HashMap<Integer, String> map = new HashMap&...
2020-05-08 10:35:31
93
原创 链表小小总结
首先是要能熟练的进行链表的增删操作啦,不管是反转链表206,每K个结点反转链表24、25,还是合并两个链表2、445都需要用到如果是存在环的链表,如何判断有环141,如何判断环入口的位置142有几个可能有用的技巧:比如增加一个头结点,这样就可以方便在链表第一个结点前添加一个结点了使用快慢指针,可以找到链表的中点,或者倒数第K个结点等...
2020-05-08 10:35:12
85
原创 链表排序和自制链表148_707
148. Sort List将一个链表排序。用归并排序快一点,时间复杂度O(nlgn)每次递归用快慢指针找到中点,然后将链表分成两个基本等长的链表将两个链表mergepublic ListNode sortList(ListNode head) { if (head == null || head.next == null) return head; ListNode...
2020-05-02 14:29:09
65
原创 链表中是否有环141_142
141. Linked List Cycle判断链表中是否有环设置两个指针,一个快一个慢每次慢的走一步,快的走两步,如果相遇就说明有环public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ListNode p = new...
2020-04-23 16:23:04
72
原创 2道链表反转leetcode25_234
25. Reverse Nodes in k-Group给一个链表和一个k,每k个结点反转一次,最后一组如果没有k个就不反转了Given this linked list: 1->2->3->4->5For k = 2, you should return: 2->1->4->3->5For k = 3, you should return:...
2020-04-23 15:15:25
99
原创 list交换结点类型两道24_206
24. Swap Nodes in Pairs交换链表中相邻的俩俩结点public ListNode swapPairs(ListNode head) { if (head == null) return null; if (head.next == null) return head; ListNode second = head.n...
2020-04-20 13:16:25
74
原创 list两道2_445
2. Add Two Numbers将两个链表相加,每个链表尾部是数字的最高位Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8Explanation: 342 + 465 = 807.public ListNode addTwoNumbers(ListNode l1, ListNode l2...
2020-04-20 11:57:02
84
原创 二分法小总结
主要分为两种:区间按序列划分和区间按值划分区间按序列划分:这种比较常见,一般是针对有序数组或者部分有序数组(如旋转有序数组),m是序列的中点,不断的缩小区间。33、81、153、154、69、162、4、74区间按值划分:主要是无序数组会使用,m取可能结果的最小值和最大值的中值,所以就是不停的猜m是大了还是小了。常用于查找数组中第K小的元素等题。378、668、719、786二分法常用的...
2020-04-18 01:27:09
154
原创 两道多点找第K值利口719_786
719. Find K-th Smallest Pair Distance给一个数组,找出每两个数字绝对差第K小的差值。Input:nums = [1,3,1]k = 1Output: 0Explanation:Here are all the pairs:(1,3) -> 2(1,1) -> 0(3,1) -> 2Then the 1st smallest...
2020-04-16 19:09:52
168
原创 两道找第k小元素利口378_668
378. Kth Smallest Element in a Sorted Matrix在一个矩阵中找到第k小的元素,矩阵可包含重复值,每行,每列递增。利用二分法主要是要找到区间,并不断缩小。区间又主要来自两个地方:序列号和元素值,大部分都是依据数组的序列号,也有小部分是通过元素值,本体就是。l设为矩阵最小值,r为最大值每次取其中值m,计算矩阵中小于m的元素的个数count如果coun...
2020-04-13 20:26:44
101
原创 两道lower_bound二分利口1101_875
875. Koko Eating Bananas有一堆香蕉,每组数量不定,koko每小时只能吃k个香蕉,且每小时只能吃一个组中的香蕉,即一小时内如果某组香蕉吃完了,那也只能干等着。求最小的k使得koko能在给定的H小时内吃完所有香蕉主要是这么几步:先确定区间,最少是1,最大就是数组中最大值用二分法每次猜一个k,然后看看能不能在H小时内吃完,来重新设置l 和 r的值,这里用lower_bo...
2020-04-11 00:49:30
83
原创 继续两道二分法利口74_4
74. Search a 2D Matrix在一个有序的二维数组中找到指定值,有序指的是从左往右有序,从上往下也有序就很简单了,和一维数组找指定值的区别就是查找两次,可以先通过最后一列数来找到target在上半段还是下半段,然后循环找到具体在哪一行然后就在该行二分查找target就行了public boolean searchMatrix(int[][] matrix, int tar...
2020-04-09 14:36:35
106
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人