- 博客(224)
- 资源 (2)
- 收藏
- 关注
原创 101. 对称二叉树
解题思路:判断一棵树是否对称,主要看三个地方。① 对于根结点,要求左右两个子结点的值要相同② 左结点的左子结点的值要等于右结点的右子结点的值③ 左结点的右子结点的值要等于右结点的左子节点的值。 public boolean isSymmetric(TreeNode root) { if (root == null) return true; return...
2020-01-31 21:56:21 238
原创 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 224
原创 153. 寻找旋转排序数组中的最小值
解题思路:二分法:可以用来查找有序或部分有序的数组。对于一个数组A,如果存在A[left] < A[right],则这个数组一定是有序的了。根据题干,可知该数组在预先某个未知点上进行了旋转,那么存在以下两种情况:① 如果A[mid] > A[start],则最小值一定在右半区间,如示例1,2。② 如果A[mid] < A[start],则最小值一定在左...
2020-01-27 18:29:36 262
原创 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 127
原创 38. 外观数列
比较相邻两个数是否相同,进而决定是移动下标,还是描述该项内容。public String countAndSay(int n) { StringBuilder builder = new StringBuilder(); StringBuilder seq = new StringBuilder(); builder.append("1"); ...
2020-01-05 21:20:55 541
原创 06. Z 字形变换
这道题目在解题时关键是要弄清楚“z字形排列”是怎么一回事,仅仅根据numRow为3的情况可能看的不会太明显,把行数为4和行数为3的情况,做一个对比,更容易找到解题思路。1)当不考虑对角线上的元素时,完成可以看成是数字是一列一列的跳转,且跳转距离为numRow * 2 - 2;2) 再去考虑计算对角线的元素的位置。 public String convert(String...
2020-01-05 16:47:09 142
原创 有效的完全平方数
public boolean isPerfectSquare(int num) { int i = 1, j=num; while (i <=j) { int mid = (i + j)/2; if (mid == (num * 1.0/mid)) // 防止乘法溢出 ...
2019-03-08 11:39:20 187
原创 寻找比目标字母大的最小字母
public char nextGreatestLetter(char[] letters, char target) { // 先判断最后一个字母是否比目标字母大 if (letters[letters.length-1] <= target) return letters[0]; int low = 0, high = letters.length-1...
2019-03-08 11:29:45 516
原创 区间列表的交集
解题思路:先要考虑两个集合存在交集的情况。通过分析,可以知道当a.s >= b.s时,交集为[a.s, min(a.e, b.e)],同理当b.s >= a.s时,交集为[b.s, min(a.e, b.e)]。 public Interval[] intervalIntersection(Interval[] A, Interval[] B) { Arra...
2019-03-07 12:15:09 982
原创 两数之和II
public int[] twoSum(int[] numbers, int target) { int i = 0, j = numbers.length-1; int[] ret = new int[2]; while (i < j) { while (target > 0 && numbers[j] > target) ...
2019-03-06 12:09:07 190
原创 删除排序数组中的重复项
public int removeDuplicates(int[] nums) { int j = 1; // 慢指针 for (int i=1; i<nums.length; i++) { if (nums[i] != nums[i-1]) { nums[j++] = nums[i]; } } return j; }...
2019-03-06 11:38:18 133
原创 有序数组的平方
public int[] sortedSquares(int[] A) { int i = 0, j = A.length-1; int k = A.length-1; int[] tmp = new int[A.length]; while (i <= j) { if (A[i] * A[i] <= A[j] * A[j]) { ...
2019-03-06 11:12:03 241
原创 移除元素
双指针:两个指针分别指向首尾,遍历头指针,遇到等于val时,遍历尾指针,找到不等于val的值,进行交换,两指针相撞时,结束。 public int removeElement(int[] nums, int val) { int i = 0, j = nums.length-1; // 将等于val的数移动到数组右边 while (i <= j) { ...
2019-03-05 13:14:16 175
原创 寻找重复数
解题思路:二分法。在区间[1, n]中搜索,首先求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数小于等于mid,则说明重复值在[mid+1, n]之间,反之,重复值应在[1, mid-1]之间,然后依次类推,直到搜索完成,此时的right就是我们要求的重复值。 public int findDuplicate(int[] nums) ...
2019-03-04 21:05:20 616
原创 两个数组的交集
二分法: 先排序,对两个数组做归并运算,使用set来去重。 public int[] intersection(int[] nums1, int[] nums2) { int i = 0, j = 0, k = 0; // 排序 Arrays.sort(nums1); Arrays.sort(nums2); HashSet<Integer> ...
2019-03-04 20:41:38 344
原创 反转字符串中的元音字母
public String reverseVowels(String s) { int i = 0; int j = s.length()-1; char c; char[] ss = s.toCharArray(); while (i < j) { while (i < j && containsVowels(ss[i])...
2019-03-04 20:16:52 476
原创 盛最多水的容器
解题思路:两个指针,一前一后,分别指向第一个元素和最后一个元素,计算此时容纳水的容量,根据两边的高度调整移动方向,指针向高的那边移动(贪心性质)两个指针相撞时就结束。 public int maxArea(int[] height) { int i = 0; int j = height.length-1; int maxWater = 0; whil...
2019-03-04 16:38:40 178
原创 最低票价
int[][] memo = null; // 备忘录 int r(int idx, int[] days, int[] costs, int deadLine) { int a, b, c, min; if (idx == days.length) return 0; // 有效期超过最后一天 if (deadLine >= days[days...
2019-03-01 18:48:53 329
原创 完全平方数
解题思路:该题目与Coin Change很相似,先找出到n为止的所有的完全平方数,然后暴力法进行搜索。当然,可以继续优化为动态规划。 int[][] memo = null; // 备忘录 public int sovle(int n, int [] squares, int idx) { if (n == 0) // 找到一种组合 return 0; ...
2019-03-01 15:28:37 1160
原创 翻转矩阵后的得分
解题思路:先判断每一行的第一个元素,是否是0,如果是,就翻转该行;判断第2列到最后一列中,每列0的个数是否大于1的个数,如果是,就翻转该列;之后按照二进制数的解释进行计算。 public int matrixScore(int[][] A) { if (A == null || A.length == 0) return 0; int rows = A....
2019-03-01 14:53:39 184
原创 加油站
解题思路:先计算从每一个站点的油量与前往下一个站点的油量之间的差, 判断是否可以从改点通往其他站点。再对每一个有可能的站点,计算环路的耗油量,如果跑完全程耗油量不小于0,则能行驶一周。 public int canCompleteCircuit(int[] gas, int[] cost) { int[] costGas = new int[gas.length]; ...
2019-02-28 15:16:31 178
原创 小Q的歌单
解题思路:分别考虑使用全使用A,全使用B,以及A,B混合使用的情况。 static long[][] memo = null; // 备忘录 public static void main(String[] args) { int k, a, x, b, y; Scanner scan = new Scanner(System.in); while (scan.h...
2019-02-27 16:29:39 224
原创 编辑距离
int[][] memo = null; // 备忘录 int solve(String word1, String word2, int c1, int c2) { int a, b, c ; int n1 = word1.length(); int n2 = word2.length(); if (c1 == n1 && c2 == n2...
2019-02-26 17:37:56 180
原创 租用游艇问题
长江俱乐部在长江设置了n个游艇出租站1,2,…n,游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),设计一个算法,计算出从出租站1到出租站n所需要的最少租金。解题思路:f(i, n) = min(f(i,j ) +f(j, k) + ..+f(k,n)) 。public class RentYa...
2019-02-26 15:43:03 395
原创 无重叠区间
解题思路:该题目类似于活动安排问题,先按照结束时间的长短进行排序,结束时间短的排在前面,在根据后一个活动的开始时间要比前一个活动的结束时间要晚的原则,从前向后筛选即可。 public int eraseOverlapIntervals(Interval[] intervals) { int n = intervals.length; int ncount = 0; ...
2019-02-25 16:54:41 202
原创 判断子序列
双指针法 public boolean isSubsequence(String s, String t) { // s为空串 if (s.isEmpty()) return true; int i = 0, j = 0; while (i < s.length() && j < t.length()) { ...
2019-02-25 15:34:12 856
原创 根据身高重建队列
解题思路:1、先按照排名进行排序,排名小的在前,若名次相同,身高矮的在前面。 2、然后按照身高大小,逐一与前面的人比较,若小于前面的人的身高,则计数器加1,当计数器等于名次时,就逐步移动数组元素,将其放到合适的位置上。 public int[][] reconstructQueue(int[][] people) { int n = people.l...
2019-02-24 16:44:59 634
原创 最长的斐波那契子序列的长度
1、暴力法 枚举所有可能的情况,计算每一种斐波那契数列的长度,取最大值。 // 暴力法(不好实施) public int lenLongestFibSubseq(int[] A) { int a, b, aa; int longest = 0; int len = 2; // 当前斐波那契子序列的长度 for (int i=0; i<A.lengt...
2019-02-23 19:18:14 844
原创 . 重构字符串
解题思路:1.先统计每个字母出现的次数 2. 按照次数由高到底排序 3. 先取最高,假设是a 4. 然后从次高中取一个,组合起来,然后重新统计次数然后回到3。 public String reorganizeString(String S) { int n = S.length(); // 键:字符,值:下标 HashMap<Character, I...
2019-02-23 17:23:08 402
原创 划分字母区间
解题思路:先用一个map统计出,每一个字符的最后出现位置。遍历字符串S,对于每一个字符,判断它的最后出现位置是否包含在 前面的字符最后出现位置内,如果不包含,就更新最后出现位置。每次达到最后出现位置时,就计算片段的长度,直到遍历结束为止。 public List<Integer> partitionLabels(String S) { ArrayList&l...
2019-02-23 15:39:28 798
原创 优势洗牌
解题思路:先对数组A排序, 对于B中的每一个元素i,在A中遍历,找到最小的大于B[j]的元素,如果找不到,就用A中最小的未使用的元素来对应。(有点像田忌赛马) public int[] advantageCount(int[] A, int[] B) { // 按照元素大小对A排序 Arrays.sort(A); // 判...
2019-02-23 14:36:11 232
原创 单调递增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)示例 1:输入: N = 10输出: 91、暴力法(超时) public int monotoneIncreasingDigits(int N) ...
2019-02-22 17:46:23 1659
原创 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。1、暴力法对于每一个子串,判断是否是回文字符串,找出长度最大者即可。 public String longestPalindrome(String s) { /...
2019-02-22 16:27:14 127
原创 救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。示例 1:输入:people = [3,2,2,1], limit = 3输出:3解释:3 艘船分别载 (1, 2), (2) 和 (3)解题思路:先按照人的体...
2019-02-22 15:58:53 543
原创 最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: ")()())"输出: 4 解释: 最长有效括号子串为 "()()" public int longestValidParentheses(String s) { // 先对字符串s进行判断 if (s == null || s.lengt...
2019-02-22 15:10:18 447
原创 整数分解
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。1、回溯法(对于每...
2019-02-21 18:06:39 1020
原创 区域和检索 - 数组不可变
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3说明:你可以假设...
2019-02-21 16:41:27 124
原创 旅行售货员问题
某售货员要到若干城市去推销商品,已知各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。解题思路:先对所有城市全排列 ,再计算每条路径的花费,取最小值。 int MinCost = Integer.MAX_VALUE; // 花费 /** * @param route 路线花费 * @param city 城市编号 ...
2019-02-18 19:09:09 1483 1
原创 子集和问题
子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得子集S1和等于c。 设计一个回溯法来求解该问题。解题思路:对于该集合的每一个子集,若元素和为正整数c,则将该子集放入解集中,最后返回解集即可。 /** * @param list 存放所有满足要求的解 * @para...
2019-02-18 16:00:15 998
原创 回溯法思想
回溯法有“通用的解题法”之称。可以用来系统地搜索一个问题的所有解或任一解。回溯法在问题的解空间树中,按照深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按照深度优先策略搜索。回溯法求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索...
2019-02-18 12:39:40 718
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人