LeetCode题目
-Billy
这个作者很懒,什么都没留下…
展开
-
101. 对称二叉树
解题思路:判断一棵树是否对称,主要看三个地方。① 对于根结点,要求左右两个子结点的值要相同② 左结点的左子结点的值要等于右结点的右子结点的值③ 左结点的右子结点的值要等于右结点的左子节点的值。 public boolean isSymmetric(TreeNode root) { if (root == null) return true; return...原创 2020-01-31 21:56:21 · 239 阅读 · 0 评论 -
100. 相同的树
解体思路:判定条件有两个:① 两棵树结构相同 ② 结点的值相同public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null) { return fa...原创 2020-01-31 21:05:55 · 225 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值
解题思路:二分法:可以用来查找有序或部分有序的数组。对于一个数组A,如果存在A[left] < A[right],则这个数组一定是有序的了。根据题干,可知该数组在预先某个未知点上进行了旋转,那么存在以下两种情况:① 如果A[mid] > A[start],则最小值一定在右半区间,如示例1,2。② 如果A[mid] < A[start],则最小值一定在左...原创 2020-01-27 18:29:36 · 263 阅读 · 0 评论 -
104. 二叉树的最大深度
解题思路:二叉树的高度(深度)可以认为是左右子树的最大高度 + 1; public int maxDepth(TreeNode root) { int leftHeight = 0, rightHeight = 0; if (root == null) { return 0; } if (root.lefNode != null) leftHe...原创 2020-01-12 00:11:36 · 128 阅读 · 0 评论 -
38. 外观数列
比较相邻两个数是否相同,进而决定是移动下标,还是描述该项内容。public String countAndSay(int n) { StringBuilder builder = new StringBuilder(); StringBuilder seq = new StringBuilder(); builder.append("1"); ...原创 2020-01-05 21:20:55 · 541 阅读 · 0 评论 -
06. Z 字形变换
这道题目在解题时关键是要弄清楚“z字形排列”是怎么一回事,仅仅根据numRow为3的情况可能看的不会太明显,把行数为4和行数为3的情况,做一个对比,更容易找到解题思路。1)当不考虑对角线上的元素时,完成可以看成是数字是一列一列的跳转,且跳转距离为numRow * 2 - 2;2) 再去考虑计算对角线的元素的位置。 public String convert(String...原创 2020-01-05 16:47:09 · 142 阅读 · 0 评论 -
47. Permutations II
给你一个包含重复数字的集合,要求返回所有唯一的排列数。1. 回溯法 public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack...原创 2018-05-25 16:18:00 · 158 阅读 · 0 评论 -
78. Subsets
给你一个包含不同整数的集合,返回它所有可能的子集。1. 回溯法public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, ne...原创 2018-05-25 16:54:14 · 395 阅读 · 0 评论 -
198. House Robber
1. 常规思路(TTL) public int rob(int[] nums) { return solve(nums.length-1, nums); } /** * @param idx 现在抢到的第几家店 * @param nums * @return */ public int solve(int idx, int[] nums) { ...原创 2018-07-27 19:46:16 · 302 阅读 · 0 评论 -
39. Combination Sum
给你一个候选数字的集合(不含重复的数字)和一个目标数,找出候选集中所有唯一的组合数,其中组合数的和为目标数。同样的数字可以使用多次。1. ...原创 2018-05-21 17:21:21 · 291 阅读 · 0 评论 -
88. Merge Sorted Array
给定两个已排好序的数组nums1和nums2,将数组nums2合并到nums1中。1. 常规思路先将数组nums2的值加入到nums1中,在合并后的数组nums1进行排序。public void merge(int[] nums1, int m, int[] nums2, int n) { // 先对nums1和nums2的情况进行判断 if (nums1.length < m +...原创 2018-05-12 17:03:07 · 184 阅读 · 0 评论 -
83. Remove Duplicates from Sorted List
给你一个排好序的链表,删除重复元素,使所有元素仅出现一次。1. 常规思路从前向后遍历所有的元素,只要下一位置的元素与当前位置的相同,就跳过,扫描完整个链表就结束。public ListNode deleteDuplicates(ListNode head) { // 先对传入的链表的情况进行判断 if (head == null || head.next == null) {...原创 2018-05-12 16:43:43 · 179 阅读 · 0 评论 -
67. Add Binary
给你两个二进制的字符串,返回它们的和(以二进制的形式)。输入的字符串都是非空的,并且至少包含一个0或11. 常规思路这样会出错,当字符串a、b过长的时候。 public String addBinary(String a, String b) { long aa = Integer.parseInt(a, 2); long bb = Integer.parseInt(b, 2); ...原创 2018-04-26 17:16:36 · 201 阅读 · 0 评论 -
66. Plus One
给你一个非空的数字数组,它表示一个非负整数,输出该整数加一后的结果。1. 设置一个进位carry,根据它的状态,判断数值变化public int[] plusOne(int[] digits) { int carry = 1; // 进位 int j = 0; // 1. 先对数组digits的情况进行判断 if (digits == null || digits.length ...原创 2018-04-26 15:49:26 · 220 阅读 · 0 评论 -
40. Combination Sum II
给你一个候选数字的集合(不含重复的数字)和一个目标数,找出候选集中所有唯一的组合数,其中组合数的和为目标数。候选集中的每一个数字只允许在组合中出现一次。1. 回溯法 public List<List<Integer>> combinationSum(int[] candidates, int target) { // 存储符合条件的结果(二维列表) List<...原创 2018-05-21 17:24:04 · 179 阅读 · 0 评论 -
90. Subsets II
给你一个可能包含重复元素的集合,返回所有可能的子集。1. 回溯法public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(...原创 2018-05-25 17:08:23 · 154 阅读 · 0 评论 -
43. Multiply Strings
给你两个以字符串形式表示的非负整数num1,num2,以字符串的形式返回它们的乘积。1. 常规思路使用数组来模拟两个数相乘的计算过程,每一次计算的结果都存放到一个临时数组中,注意计算过程中的进位问题。public String multiply(String num1, String num2) { // 先对num1和num2的情况进行判断 if (num1 == null || nu...原创 2018-05-22 21:17:43 · 225 阅读 · 0 评论 -
72. Edit Distance
给你两个单词word1,word2,使用最少的次数将word1转化为word2。你只可以进行下面三种操作:1、插入一个字符 2、删除一个字符 3、替换到一个字符。 递归求解(记忆化搜索)class Solution { int[][] memoized = null; // 备忘录 public int minDistance(String word1, Str...原创 2018-09-08 22:06:47 · 174 阅读 · 0 评论 -
322. Coin Change
int maxVal = 1000000000; // 把非法的值设置为我们期望方向的反方向 public int search(int idx, int amount, int[] coins) { if (amount == 0) return 0; if (amount < 0) return maxVal; // 返会非常大的数,表示非法(不可以返回-...原创 2018-08-08 22:32:53 · 224 阅读 · 0 评论 -
410. Split Array Largest Sum
题目给的例子中,output为18,假如结果是17,那么对于nums数组分析得到的m的值必定是大于2的。此时分成的数组是[7,2,5],[10], [8]。 也就是说output和m之间是负相关的。 public boolean guess(long mid, int[] nums, long m) { long sum = 0; long mm = 0; // 使...原创 2018-08-11 22:10:43 · 752 阅读 · 0 评论 -
202. Happy Number
对于某一个正整数,如果对其各个位上的数字分别平方,然后再加起来得到一个新的数字,再进行同样的操作,如果最终结果变成了1,则说明是快乐数,如果一直循环但不是1的话,就不是快乐数,利用推导出来的性质,非快乐数有个特点,循环的数字中必定会有4 。 boolean isHappy(int n) { while (n !=1 && n != 4) { ...原创 2018-08-01 22:43:28 · 520 阅读 · 0 评论 -
268. Missing Number
利用等差数列的求和公式求出0到n之间所有的数字之和,然后再遍历数组算出给定数字的累积和,然后做减法,差值就是丢失的那个数字。 public int missingNumber(int[] nums) { long n = nums.length; return (int) (n * (n+1) / 2 - IntStream.of(nums).sum()); } ...原创 2018-08-01 22:28:57 · 283 阅读 · 0 评论 -
258. Add Digits
找规律: ab % 9 = (a*9+a+b)%9 = (a+b)%9 abc = a*100 + b*10 + c abc % 9 = (a*99 + b*9 +a + b + c)%9 = (a+b+c)%9 int addDigits(int num) { if (num == 0) return 0; return (num-1)%9 + 1; /...原创 2018-08-01 22:17:24 · 277 阅读 · 0 评论 -
120. Triangle
给出一个三角形状的整数list,从第一行开始向下移动,每次只能向下一行相邻的数移动,要求求出从第一行到最后一行所经过的数字的和最小的方法。1. 自顶向下计算public int minimumTotal(List<List<Integer>> triangle) { int row = triangle.size(); // 行数 if (row...原创 2018-07-24 17:54:11 · 304 阅读 · 0 评论 -
48. Rotate Image
给你一个 n x n的2D矩阵,代表一张图片,将这个图片旋转90度。1. 常规思路(申请额外空间) public void rotate(int[][] matrix) { // 先对matrix的情况进行判断 if (matrix == null || matrix.length == 0) return; // 翻转后的矩阵(使用额外的空间) int[][] ro...原创 2018-06-02 16:07:56 · 186 阅读 · 0 评论 -
70. Climbing Stairs
你正在爬楼梯,需要n个步骤才能到达顶部。每一次你可以爬1步或2步。有多少种不同的方法可以爬到顶端?注:给定的n为正整数。1. 动态规划思想思路:当n<=1,爬1步当n>1时,对于第i个台阶,到达该台阶有两种方法,从第i-1个台阶上迈一步,或从第i-2个台阶上迈两步。即到达台阶i的方法数=到达台阶i-1的方法数+到达台阶i-2的方法数。 public int climbStairs(in...原创 2018-04-30 21:28:50 · 235 阅读 · 0 评论 -
54. Spiral Matrix
给你一个m行n列的矩阵,以螺旋形的顺序输出矩阵中所有的元素。原创 2018-05-09 20:14:00 · 422 阅读 · 0 评论 -
58. Length of Last Word
给你一个由大小写字母及空格字符组成的字符串,返回字符串中最后一个单词的长度。如果最后一个单词不存在,返回0。1. 常规思路(1) 利用java的split( )函数分割字符串,并取最后一个单词的长度。public int lengthOfLastWord(String s) { int len = 0; // 先判断字符串s的情况 if (s == null || s.trim()....原创 2018-04-23 20:52:12 · 176 阅读 · 0 评论 -
50. Pow(x, n)
实现pow(x,n)函数。这里需要注意的是x、n可正可负可为0.1. 直接调用java的内置函数public double myPow(double x, int n){ return Math.pow(x, n);}2. 基本思路(超时)public double myPow(double x, int n) { double val = 1; boolean flag = fa...原创 2018-04-08 22:13:37 · 378 阅读 · 0 评论 -
11 Container With Most Water
给你n个非负整数a1, a2, ...an,每一个代表一个坐标(i, ai)。有n条垂线画在画布上,两个端点分别是(i, ai) 和(i, 0)。请找出两条线,这两条线与x轴形成一个容器,这个容器中包含尽肯能多的水。注意:你不必把它当成容器,n至少是2。1. 暴力法 (Time Limit Exceeded)逐个计算每一个container的面积,找出面积最大的。 public int ma...原创 2018-03-30 17:32:39 · 389 阅读 · 0 评论 -
9 Palindrome Number
判断一个整数是否是回文(不要使用额外的空间)1. 转换为字符串来比较 public boolean isPalindrome(int x) { if (x < 0) return false; String s = String.valueOf(x); for (int i=0; i<s.length()/2; i++) { if (s.cha...原创 2018-03-25 16:14:35 · 164 阅读 · 0 评论 -
8 String to Integer (atoi)
实现一个atoi函数,将一个字符串转换为一个整数。提示:请仔细的考虑所有可能的输入用例。如果你想挑战的话,请不要浏览一下的内容,自己尝试着思考一下。aoti函数的要求:该函数首先在找到第一个非空白字符之前,尽可能多的丢弃空白字符。然后从根据这个字符,取一个可选的初始正负号,并尽可能多的往下找数值,并将它们解释为相应的数字。该字符串可以在数字的后面包含其他的字符,这些字符被忽略,并且对这个函数的行为...原创 2018-03-25 15:28:49 · 235 阅读 · 0 评论 -
24. Swap Nodes in Pairs
给你一个链表,交换每两个相邻的节点,并返回它的头部。你的算法需要使用常量的空间,不可以交换链表中的元素,只有节点本身可以被改变。1. 增设头节点,用来指向每次交换完两个指针后断开的链。 public ListNode swapPairs(ListNode head) { ListNode header = new ListNode(0); // 增设新链表的头结点 header.next...原创 2018-04-08 10:23:54 · 134 阅读 · 0 评论 -
3 Longest Substring Without Repeating Characters
给你一个字符串,请找出该字符串不包含重复字符的最长子串。1. 暴力法 (超时)检查所有的子串,看它是否不含重复字符为了迭代给定字符串的所有子串,我们需要找到这些子串的开始和结束下标。分别用i和j表示开始和结束下标,则得到0≤i<j≤n ([i,j)),然后使用两个迭代的循环,来遍历所有的子串。为了检测一个子串是否不含重复字符,我们可以使用set,在遍历给定字符串的每...原创 2018-03-21 14:48:50 · 103 阅读 · 0 评论 -
7 Reverse Integer
给你一个带符号的32位的整数,给出该整数反转后的结果注意:假设我们的环境只能处理32位有符号范围内的整数,如果反转后的整数溢出,请在你的函数中返回0。1. 利用java自带的将字符串转为数字的方法,要注意反转后的整数是否会溢出。 public int reverse(int x) { int maxInt = 0x7fffffff; // 32位最大正数 int minI...原创 2018-03-24 16:29:22 · 169 阅读 · 0 评论 -
2 Add Two Numbers
给你两个包含非负整数的非空链表,这些数字以逆序存储,每个节点包含一个数字。将这两个数字相加并作为一个链表返回,你可以假设这两个数字不包含任何前置的0,当然0本身除外。1. 链表计算使用一个变量跟踪进位,并从链表头部开始逐个数字相加,一直计算到链表尾部。我们使用头结点来简化代码,如果没有头结点,就需要编写额外的语句来初始化首源节点的值。注意以下测试测试用例:pu...原创 2018-03-20 08:52:28 · 130 阅读 · 0 评论 -
5 Longest Palindromic Substring
给定一个字符串s,找出s中的最长回文串,假定s的最大长度是1000。1. 暴力法(超时)对于字符串s的每一个子串s[i,j),判断它是否是回文串,如果是,记下该字符串和它的长度,当遍历完所有的子串时,就可以找到满足要求的子串。 public String longestPalindrome(String s) { String ans = null; int i = 0, ...原创 2018-03-25 21:14:57 · 83 阅读 · 0 评论 -
15. 3Sum
给你一个含有n个整数的数组S,找出S中满足a+b+c=0的元素a,b,c。要求它们不能重复。1. 枚举元素(超时) public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> list = new ArrayList<List<Integer>&g...原创 2018-04-09 18:59:11 · 302 阅读 · 0 评论 -
26. Remove Duplicates from Sorted Array
给你一个排好序的数组,删除重复的元素,使得每一个仅出现一次,返回新数组的长度。不能为另一个数组分配额外的空间,你必须通过修改输入数组来完成。要求空间复杂度为O(1)。1. 常规思路因为该数组已经排好序了,比较相邻元素是否相同,如果不相同就放到原数组中。public int removeDuplicates(int[] nums){ int j = 0; if (nums.length ==...原创 2018-04-01 19:33:27 · 88 阅读 · 0 评论 -
46. Permutations
给你一个包含不同整数的集合,返回集合中所有数字的排列数的情况。1 . 递归实现 List<Integer> list = null; List<List<Integer>> all = new ArrayList<>(); // 存放所有可能的排列数 // 递归实现 public List<List<Intege...原创 2018-04-14 20:52:25 · 225 阅读 · 0 评论