let剑指
the_conquer_zzy
计算机科学与技术专业
展开
-
let 96
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?解法一:找规律,这种解法就是要找出一个具有普遍规律的解法,首先就是把每一个节点作为根节点进行遍历,然后去求左右子树有多少种, 根据乘法原理, 左子树乘以右子树的种类数就是当前的子树个数。又根据递推原理, 当一个节...原创 2018-11-10 22:33:19 · 127 阅读 · 0 评论 -
let 107. Binary Tree Level Order Traversal II
主题思想: 主要思路还是利用队列进行层次遍历,但是插入时,利用LinkedList 可以指定插入位置的特性,每次都把下一层插到最前面,这样就是一个倒序了。 其他麻烦点方法是: 按照层次全部压入栈中,并记录下对应层次的个数,这样,最后出栈,组装,输出。但是还是第一种利用LinkedList 特性最为方便。AC 代码:/** * Definition for a binary tree原创 2018-01-28 22:31:33 · 92 阅读 · 0 评论 -
let 106. Construct Binary Tree from Inorder and Postorder Traversal
主题思想: 这题和105 姊妹题,主要思想就是递归,然后利用中序遍历的特点,后序遍历的特点,把原数组,利用起始下标的不同,分割成左右子树,两段,然后递归构造左子树,和右子树。具体AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode原创 2018-01-28 22:10:32 · 127 阅读 · 0 评论 -
105. Construct Binary Tree from Preorder and Inorder Traversal
主题思想: 经典题,二叉树的构建,利用前序和中序序列进行二叉树的构建。首先采用递归的思想: 从前序序列找根节点,然后去中序序列里面找到根节点的下标,中序序列中在根节点之前的元素构成根节点的左子树节点,之后的构成右子树节点,递归下去。中序序列以根节点为分界分成左右两个部分,这个容易理解,那在前序序列中,又如何分割为左右子树两个部分呢?这个就需要计算在中序中,根节点左边有多少个节点原创 2018-01-27 17:57:19 · 100 阅读 · 0 评论 -
let 49 Group Anagrams
Given an array of strings, group anagrams together.For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"], Return:[ ["ate", "eat","tea"], ["nat","tan"], ["bat"]]主题思想: 这个刚开始第一眼思原创 2018-01-10 22:00:06 · 112 阅读 · 0 评论 -
104. Maximum Depth of Binary Tree
主题思想: 递归计算树的层高。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } *原创 2018-01-27 15:50:44 · 112 阅读 · 0 评论 -
let 103. Binary Tree Zigzag Level Order Traversal
主题思想: 我是用栈解决的,还有一种方法是利用递归。 利用栈的AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val原创 2018-01-27 12:59:27 · 183 阅读 · 0 评论 -
let 102 Binary Tree Level Order
主题思想: 按层打印二叉树, 需要使用队列结构, 难点在于如何表示每层,这里有个技巧,就是每次先记录队列中的容量, 来表示一层的数目,在执行完一层后,应该把上一层的全部从队列中取出,并把下一层的放进队列中。 具体AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int v原创 2018-01-27 12:02:02 · 117 阅读 · 0 评论 -
let 46 Permutations
Given a collection of distinct numbers, return all possible permutations.For example,[1,2,3] have the following permutations:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]主原创 2018-01-10 16:15:11 · 118 阅读 · 0 评论 -
let 45 Jump Game II
主题思想: 这是一道贪心算法, 要尽可能地跳的远,首先 明确什么时候更新步数, 根据当前i 能知道从i 能走到的最大步数 ith-long,在没走到ith-long达到的最大步数之前,记录中间步骤所能更新的最大值,当i达到ith-long 是更新下一步最大值为中间的最大值,并更新步数。class Solution { public int jump(int[] nums) {原创 2018-01-10 15:13:27 · 153 阅读 · 0 评论 -
let44 Wildcard Matching
'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).The matching should cover the entire input string (not partial).The function prototype shoul原创 2018-01-09 21:58:17 · 191 阅读 · 0 评论 -
let 79 Word search
Given a 2D board and a word, find if the word exists in the grid.The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically n原创 2018-01-17 21:57:05 · 195 阅读 · 0 评论 -
let 78 Subsets
Given a set of distinct integers, nums, return all possible subsets (the power set).Note: The solution set must not contain duplicate subsets.For example,If nums = [1,2,3], a solution is:[ [3原创 2018-01-17 21:08:06 · 94 阅读 · 0 评论 -
let 77 Combinations
主题思想: : 有序数组,组合, 1…. n 可以抽象为一个有序数组, 题目大意就是从n个元素挑出k个的所有组合。AC 代码: 代码中需要注意的一点就是,java是依靠引用的,在ans.add()时,必须新建list 对象,否则在执行完 dfs 会执行,tmp.remove() 这时,会清楚已经加入到ans的list ,导致ans 结果变成[[],[],[],[],...] 就是因为fo原创 2018-01-17 18:02:35 · 144 阅读 · 0 评论 -
let 76. Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).For example,S = "ADOBECODEBANC"T = "ABC"Minimum window is "BANC".Not原创 2018-01-17 16:21:44 · 114 阅读 · 0 评论 -
let43 Multiply String
主题思想: 大数乘法, 这里写一种大数乘法的通用模板,整体思路是: 利用数组,一个int型数组表示长度为4的子串, 为什么是4呢? 因为int 型 21亿,1亿=10^9, 长度为4最大值9999,两个值相乘大体思路如下,把字符串,按每四位截取,并转换成int 存储在数组里运算时,对int数组进行运算,输出结果需要注意,去除前导0, 对于中间值为0的情况,要输出4个0.代码:原创 2018-01-08 22:48:08 · 157 阅读 · 0 评论 -
let 108. Convert Sorted Array to Binary Search Tree
主题思想: 升序有序数组,转成平衡二叉树。利用递归,选取数组中间节点作为根节点。循环构造左右子树。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * T原创 2018-01-28 22:41:06 · 87 阅读 · 0 评论 -
let 84 Maxmuim Rectange in Historgram
主题思想: 这是一道求最值问题,一般这种问题,是动态规划问题,一种最容易想到的方法是,用一根线扫描,这样有多少个高度就需要多少根线,没扫描一次,O(n) 总的就是 n^2这里利用栈的思想: 如果一个条状,他后面的条高度比他高,那么这个条状肯定不是最大面积的终止条,因为扩展到后面的条面积就增加了,所以,只有出现下降条时,才可能出现最大值。 所以用栈维护一个单调非递减数值,记录下标,遇见当前原创 2018-01-20 20:52:30 · 192 阅读 · 0 评论 -
let 85 Maximal Rectangle
主题思想: 这题是84的升级版,之所以记录这道题是因为,解决这道题的思想,值得学习。可以作为解决类似问题的通用思想。这是二维的,84是一维的, 那么把二维化成1维就实现了降维,这种思想和求最大子序列和,以及求矩阵中最大子序列和是一样的。或者说这道题本身,就和求最大子序列和是类似的题。解法类似。这种思想值得注意,就是解二维题是,通过把数据累加的方式,转化成1维问题, 第一行加上第二行原创 2018-01-20 21:09:28 · 244 阅读 · 0 评论 -
let 135. Candy
主题思想: 正向来一次,反向来一次。AC 代码:class Solution { public int candy(int[] ratings) { if(ratings==null)return 0; if(ratings.length<=1) return ratings.length; int n=ratings.len...原创 2018-03-21 22:51:10 · 106 阅读 · 0 评论 -
let 134. Gas Station
主题思想: 这个肯定O(n)有些事情需要考虑清楚,如果遇到哪个站点,无法走下去了,肯定需要从下一个站点重新开始才有可能继续走下去。记录下总的气量和花费气量差值,如果小于0,肯定无法完成。class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { if(gas==null||gas...原创 2018-03-21 22:12:28 · 99 阅读 · 0 评论 -
131. Palindrome Partitioning
主题思想: 回溯法,好久没写,这种套路,再温习下class Solution { public List<List<String>> partition(String s) { List<List<String>> ans=new ArrayList<List<String>>(); ...原创 2018-03-21 21:25:38 · 105 阅读 · 0 评论 -
let 142. Linked List Cycle II
首先如何找链表有环 解法: public class Solution { public boolean hasCycle(ListNode head) { if(head==null) return false; ListNode first=head; ListNode second=head; while(...原创 2018-03-23 21:19:01 · 125 阅读 · 0 评论 -
let 139. Word Break
主题思想: 判断一个字符串是否能由一个字典中的字符串拼接而成。AC 代码:class Solution { public boolean wordBreak(String s, List<String> wordDict) { boolean [] flag=new boolean[s.length()+1]; flag[0] =tr...原创 2018-03-22 22:23:17 · 162 阅读 · 0 评论 -
let 137. Single Number II
主题思想: 通用的解决方法, 对于一个数组中,只有一个数出现1次,其他数出现n次这种问题,采用利用位运算的解法, n=2,只出现2次时,很容易想到用异或的解法,本质还是用位运算,如果一个数出现n次,那么这个数的每一个为1的位,出现的次数等于n,如果统计每一个位出现的次数sum, 并对n求模, sum%n, 那么每一个在该位为1的出现n次的数,最后取模都等于0,剩余的位就肯定来自于单独出现的那个...原创 2018-03-22 21:04:32 · 115 阅读 · 0 评论 -
let 136. Single Number
找出数组中只出现一次的数,其余的数都出现两次。主题思想: 异或的定义,相同为0, 不同为1, 数组里每个数都异或操作,最后肯定是0和只出现一次的那个数异或,任何数和0异或等于数本身。AC代码:class Solution { public int singleNumber(int[] nums) { if(nums.length==1) return nums...原创 2018-03-22 20:41:33 · 108 阅读 · 0 评论 -
let 121. Best Time to Buy and Sell Stock
主题思想: 直觉应该是到dp问题,不应该是O(n^2)的解法,所以寻找方法进行转化,最后发现如果计算每天的差值,就可以转化为求差值数组的连续最大子数组问题,因此问题得解。AC 代码:class Solution { public int maxProfit(int[] prices) { if(prices==null||prices.length==0) r...原创 2018-03-12 21:57:16 · 137 阅读 · 0 评论 -
let129. Sum Root to Leaf Numbers
主题思想: 一个简单的递归遍历,是后序遍历,先左子树,再由子树,如果一个节点是叶子节点,则返回当前根到叶子节点代表的值,如果是非叶子节点,则返回左右子树和的值AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...原创 2018-03-17 15:36:47 · 95 阅读 · 0 评论 -
let 128 Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3, 4]...原创 2018-03-17 15:02:45 · 90 阅读 · 0 评论 -
let 114. Flatten Binary Tree to Linked List
主题思想: 这种方法有两种方法: 1. 按照提示,按前序顺序记录节点,然后重建树。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo原创 2018-01-30 16:25:39 · 123 阅读 · 0 评论 -
let 113. Path Sum II
主题思想: 递归回溯, 关键点在于什么时候选择回溯,什么时候应该结束。当遇到null 时结束,则应该在遍历完一个节点的左右子树过后,再删除栈顶元素。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *原创 2018-01-29 22:56:25 · 109 阅读 · 0 评论 -
let 112. Path Sum
主题思想: 判断是否存在一条根节点到叶子节点的路径,路径上的和等于指定数值。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int原创 2018-01-29 22:23:10 · 105 阅读 · 0 评论 -
let 111. Minimum Depth of Binary Tree
主题思想: 递归, 找根节点到叶子节点的最小路径长度。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val =原创 2018-01-29 22:07:47 · 110 阅读 · 0 评论 -
let 110. Balanced Binary Tree
主题思想: 递归求解,判断是不是平衡而叉树。AC 代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }原创 2018-01-29 21:49:01 · 102 阅读 · 0 评论 -
let41 41. First Missing Positive
Given an unsorted integer array, find the first missing positive integer.For example,Given [1,2,0] return 3,and [3,4,-1,1] return 2.Your algorithm should run in O(n) time and uses constant space原创 2018-01-08 15:47:50 · 98 阅读 · 0 评论 -
let 75 Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.Here, we will use the integers 0,原创 2018-01-16 22:27:38 · 126 阅读 · 0 评论 -
let 92. Reverse Linked List II
主题思想: 链表翻转:链表翻转, 链表翻转经典代码:public ListNode reverseList(ListNode head){ if(head==null||head.next==null) return head; ListNode prev=null,next=null; while(head.next!=null){ next原创 2018-01-21 21:35:54 · 114 阅读 · 0 评论 -
let 55 Jump Game
主题思想: 这个和Jump GameII 是类似的题做题思路就是贪心算法, 首先获取最大可以走到的下标,然后依次走一步,记录在走到上一次计算到的最大下标位置时出现的最大值,当走到上一次计算的最大下标时,更新下一步可以到达的最大下标,如果下一步可以到达的下标大于数组最后一个元素下标,则可以到达。如果等于当前下标,说明止步不前,则无法到达数组最后一个元素。AC代码:class Sol原创 2018-01-12 21:33:45 · 103 阅读 · 0 评论 -
let 52 N-Queens II
主题思想: 回溯,搜索题。 这次考察回溯如何返回值。AC 代码:class Solution { public int totalNQueens(int n) { return dfs(0,n,new ArrayList ()); } public int dfs(int step,int n,List record){ if原创 2018-01-12 20:57:39 · 114 阅读 · 0 评论 -
let 51 N-Queens
主题思想: 这是一道搜索题, 典型的回溯算法思路。 当搜索时,通常满足条件,需要改变某种状态。一种情况处理完后,应该把改变的状态再改回来,这就是回溯的核心。 典型的深度搜索。 具体到这道题, 可以对存储空间优化,因为搜索时可以一行一行搜索,即先寻找第一行合适的位置,再寻找第二行,这样可以用一个List 记录每一行的位置,list中添加的下标就是行号,存储的值是对应的列值。具体代码:cl原创 2018-01-12 20:56:18 · 103 阅读 · 0 评论