自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 力扣解题思路:字符串

205. 同构字符串思路:给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。我们比较直观的想法是用map,将对应位置形成映射关系,下次出现相同的单词对比map中的值即可,如果不一样,直接返回false,如果map中没有这个映射!map.containsKey(s.charAt(i))时,就要考虑是否map.containsVa

2020-07-31 11:24:23 285

原创 力扣解题思路:并查集

684. 冗余连接思路:有一系列的边连成的图,找出一条边,移除它之后该图能够成为一棵树。Input: [[1,2], [1,3], [2,3]]Output: [2,3]Explanation: The given undirected graph will be like this: 1 / \2 - 3如果移除一条边可以成为一棵树那就意味着这个图存在环路,那么移除这个环的任意边即可(题目要求是最后一条边),所以我们可以使用并查集来记录每个节点的最前前驱节点,也就是父节点,如果两个节点的

2020-07-28 12:38:30 827

原创 力扣解题思路:图 纠错记录

785. 判断二分图思路:给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。举个例子:Input: [[1,3], [0,

2020-07-25 22:54:13 417

原创 力扣解题思路:数组查找

287. 寻找重复数思路:题目要求找的重复的数,要求不能修改数组,也不能使用额外的空间。快慢指针思想, fast 和 slow 是指针, nums[slow] 表示取指针对应的元素注意nums 数组中的数字都是在 1到 n 之间的(在数组中进行游走不会越界),因为有重复数字的出现, 所以这个游走必然是成环的, 环的入口就是重复的元素,即按照寻找链表环入口的思路来做...

2020-07-24 09:41:52 308

原创 力扣解题思路:矩阵查找

240. 搜索二维矩阵 II思路:矩阵从左到右,从上到下递增,例如:[ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]]因为矩阵的右上角是该行最大的元素,也是该列最小的元素,所以我们从右上角出发开始于目标数进行比较,如果大于目标树则往左扫描,若小于目标数则往下扫描,完整代码如下:public boolean searchMatrix(int[][] matrix, int target) { if (matrix == null || m

2020-07-23 09:18:22 495

原创 力扣解题思路:前缀树/字典树/Trie

实现 Trie 前缀树是一种数据结构,是一种多叉树,每个节点有26个子节点,分别代表26个字母,也是就对于任何一个字符串,可以分割成一个个字符表示在Trie中,每个节点的子节点表示其下一个字符,Trie主要用于判断字符串是否存在或者是否具有某种字符串前缀,所以又叫前缀树、字典树。接下来直接来看前缀树的实现,分别实现了insert, search, 和 startsWith 这三个方法:class Trie { class Node { boolean isWord;

2020-07-22 11:03:15 383

原创 力扣解题思路:链表分割中遇到的问题

109. 有序链表转换二叉搜索树思路:给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。这一题和108类似,只不过108是将数组转化为二叉搜索树,不过都是一样的,都是先找到链表的中点作为根节点,然后对左右两边进行递归(分治法),按照和数组一样的思路,但是需要注意的一点是,找到链表终点后不能直接对head和链表中点的下一个节点进行递归,一定要先截断链表!!!(不然在下一次调用时的head又是最初

2020-07-21 15:16:50 98

原创 力扣解题思路:653. 两数之和 IV- 输入 BST

653. 两数之和 IV - 输入 BST思路:给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。这一题我认为是比较简单和比较基础的,我们用三种方法来解题。(方法1:DFS中序遍历)对于树结构的题,遍历树无非是DFS和BFS,由于这是一颗二叉搜索树,所以其中序遍历就是其排序后的结果,那么我们将中序遍历后的结果保存在list中,用双指针的方式分别从头和尾遍历链表即可找到是否有目标和的结果了,完整代码如下:public boolean findT

2020-07-21 11:03:54 181

原创 力扣解题思路:二叉树的遍历(前序/中序/后序/层次)(递归/非递归)

遍历一棵二叉树最简单的方法就是采用递归法,也就是DFS,比较简单。前序遍历:public void dfs(TreeNode root) { visit(root); dfs(root.left); dfs(root.right);}中序遍历:public void dfs(TreeNode root) { dfs(root.left); visit(root); dfs(root.right);}后序遍历:public void dfs(Tr

2020-07-20 10:37:39 312

原创 力扣解题思路:二叉搜索树 (BST)

669. 修剪二叉搜索树思路:给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。举个例子:Input: 3 / \ 0 4 \ 2 / 1 L = 1 R = 3Output: 3 / 2 / 1先看一下我的错误案例,最初的想法是,只要不满足区间的直接

2020-07-20 09:45:52 315

原创 力扣解题思路:513. 找树左下角的值

513. 找树左下角的值思路:给定一个二叉树,在树的最后一行找到最左边的值。例如:Input: 1 / \ 2 3 / / \ 4 5 6 / 7Output:7很显然,这题可以用DFS和BFS来解题,但是由于所求是最后一行的最左边的值,那么最合适的是采用层次遍历树,也就是BFS遍历树。(方法1:BFS)我们在遍历树的每一层的时候用一个列表来保存每一层的节点的值,每次遍历一层前,清除掉之前列

2020-07-19 11:49:17 145

原创 力扣解题思路:二叉树 纠错记录

解决树问题用的比较多的也是DFS算法,接下来介绍一下我之前容易错的几道有关树的遍历的题目:543. 二叉树的直径思路:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。这题如果看懂了题目就很简单,也就是说求每个节点的左右子树的高度和的最大值(因为最长路径是可能不经过根节点的),我们只需要遍历所有节点,然后维护一个全局最大值不断的更新它就行了:public int max = 0;public int diameter

2020-07-17 10:18:58 200

原创 力扣解题思路:328. 奇偶链表

328. 奇偶链表思路:题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。Example:Given 1->2->3->4->5->NULL,return 1->3->5->2->4->NULL.首先我们将一个链表分成两条,一条记录

2020-07-16 10:33:42 155

原创 力扣解题思路:234. 回文链表

234. 回文链表思路:题目要求判断链表是否为回文链表,由于链表只能从前往后遍历,所以这一题考察的目的很简单,首先就是要找到链表的中点,然后反转链表中点及之后的所有节点,最后使用双指针依次判断即可。首先,通过快慢指针找到中点:while(fast!=null&&fast.next!=null){ fast = fast.next.next; slow = slow.next; }此时中点就是slow了,接下来反转链表

2020-07-16 09:40:28 91

原创 力扣解题思路:路径总和 纠错记录

113. 路径总和 II思路:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。最简单的方式就是DFS,代码比较简单:

2020-07-15 09:11:59 145

原创 力扣解题思路:503. 下一个更大元素 II 纠错记录

503. 下一个更大元素 II思路:由题目,给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。这一题我主要来记录我的错误原因,首先如果这一题的题目不是循环数组,那么这一题用栈来解决很简单,看代码:public int[] nextGreaterElements(int[] nums) { int[] r

2020-07-14 13:31:30 173

原创 力扣解题思路:队列与栈 纠错记录

232. 用栈实现队列思路:由于队列是先进先出,栈是先进后出,所以要用栈实现队列只能使用两个栈,因为执行一次出栈和入栈之后栈元素的顺序就会正好相反,所以再取出的peek就是队头啦~~class MyQueue { private Stack<Integer> in = new Stack<>(); private Stack<Integer> out = new Stack<>(); public void push(int x

2020-07-14 10:20:51 212

原创 力扣解题思路:分割数组/背包问题(动态规划)纠错记录

416. 分割等和子集思路:题目:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。举个例子:Input: [1, 5, 11, 5]Output: trueExplanation: The array can be partitioned as [1, 5, 5] and [11].显然这就是一个0-1背包问题背包问题的讲解可以参考这里o( ̄▽ ̄)ブ首先我们的目的是确定背包的容量,也就是sum / 2,而且不多不少刚好sum / 2,当然sum也必须是个

2020-07-13 09:45:18 683

原创 力扣解题思路:1143. 最长公共子序列

1143. 最长公共子序列思路:题目就不多说了,很简单,举个例子:输入:text1 = “abcde”, text2 = “ace”输出:3解释:最长公共子序列是 “ace”,它的长度为 3。(方法1:递归法:超时)首先看题目,两个字符串,而且还需要比较相同的字符,我第一反应想到的就是双指针,即如果text1.charAt(start1) == text2.charAt(start2)则两个指针都移动,否则分别移动第一个指针或者第二个指针,这显然就是一种递归,于是代码如下: public

2020-07-12 10:48:02 306

原创 力扣解题思路:376. 摆动序列

376. 摆动序列思路:我们需要找到最长摆动序列。一个摆动序列是一个上升下降交替的子序列。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。(方法1)这一题按照类似于最长上升子序列的方法,可以写出简单的动态规划,用两个dp数组保存每次上升或下降的最长子序列,我的代码如下:public int wiggleMaxLength(int[] nums) { int[] dpadd = new int[nums.

2020-07-12 10:01:51 252

原创 力扣解题思路:300. 最长上升子序列 纠错记录

300. 最长上升子序列思路:题目:给定一个无序的整数数组,找到其中最长上升子序列的长度。例如:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。看到题目首先考虑动态规划,令dp[i]为以nums[i]结尾的最长上升子序列长度,所以有动态方程:if(nums[j]<nums[i]) dp[i] = Math.max(dp[i],dp[j]+1);其中j是比i小的数,遍

2020-07-11 11:39:19 83

原创 力扣解题思路:分割整数

343. 整数拆分思路:题目要求给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。例如10可以拆分成4和6而6又可以继续拆分成3,3也可以继续拆分,那么实际上是可以用DFS解题的,但是除了DFS还有没有更简单的方法呢?显然动态规划是个不错的选择,因为就刚才那个例子,反过来3的拆分会影响6,6的拆分会影响10。接下来就可以定义动态方程了->定义dp[i]为正整数i能活得的最大乘积,给定一个j<i,i可以拆分成j和i-j,j可以继续拆分也可以

2020-07-11 09:09:35 266

原创 力扣解题思路:等差数列划分 纠错记录

413. 等差数列划分思路:题目:A = [0, 1, 2, 3, 4]return: 6, for 3 arithmetic slices in A:[0, 1, 2],[1, 2, 3],[0, 1, 2, 3],[0, 1, 2, 3, 4],[ 1, 2, 3, 4],[2, 3, 4]如果相邻的三个数两两做差相等就是等差数列,自然而然的想到动态规划,先定义动态规划方程->dp[i] 表示以 A[i] 为结尾的等差递增子区间的个数。当 A[i] - A[i-1] ==

2020-07-10 20:53:03 195

原创 力扣解题思路:最小路径和问题

64. 最小路径和思路:题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。其中,次只能向下或者向右移动一步。显然每一步的路径总和都与上一步有关,那么我们马上能想到使用动态规划解题,首先找到动态方程:dp[i][j] = Math.min(dp[i-1][j]+grid[i-1][j-1],dp[i][j-1]+grid[i-1][j-1])然后就可以愉快的写代码了:public int minPathSum(int[][] grid)

2020-07-10 11:08:53 554

原创 力扣解题思路:打家劫舍

213. 打家劫舍 II思路:题目:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。这一题与198. 打家劫舍 唯一的区别是此时nums可以视为一个环形数组,回忆一下198题,由于不可以在相邻的房屋闯入,所以在当前位置

2020-07-10 10:23:02 676

原创 力扣解题思路:组合与全排列问题 纠错记录

排列组合题型中遇到的问题思路:之前做过很多排列组合的题目比如力扣46题,求的是无重复数组的全排列,这个比较简单,直接DFS即可,DFS函数的出口就是结果子集中的元素个数刚好是数组总元素的个数。而第47题就是46的升级版,就是求的是有重复元素数组的全排列,这里就需要考虑到组合会产生重复的子集,于是我用的hashSet来解决这个重复的问题,感觉笨笨的,递归出口是这样写的:if(prefix.size()!=0 && candidate.size()==0){ StringBuild

2020-07-09 11:54:35 548

原创 力扣解题思路:String与StringBuilder

257. 二叉树的所有路径思路:题目:给定一个二叉树,返回所有从根节点到叶子节点的路径。这是一道很简单的考察回溯算法的题目,只要分别对左右子节点进行递归即可(DFS),这样就可以写出代码: public void backtracking(TreeNode root, String path, LinkedList<String> paths) { if (root != null) { path += Integer.t

2020-07-08 10:51:35 256

原创 力扣解题思路:93. 复原IP地址

93. 复原IP地址思路:题目:Given "25525511135",return ["255.255.11.135", "255.255.111.35"].由题目可知我们的目的就是找到三个分割点使分割出来的IP地址是一个合法的IP地址,显然可以用回溯法来解题,一个一个的分割点尝试如果合法则加入结果集中,由于结果集需要在回溯函数里用到,所以我们可以定义结果集在函数外(当然也可以让结果集作为回溯函数的参数,但是为了函数的简洁我就不这么做了)->接下来考虑回溯函数的构造,首先回溯函数需要哪些

2020-07-08 09:33:56 191

原创 力扣解题思路:417. 太平洋大西洋水流问题

417. 太平洋大西洋水流问题思路:题目:Given the following 5x5 matrix: Pacific ~ ~ ~ ~ ~ ~ 1 2 2 3 (5) * ~ 3 2 3 (4) (4) * ~ 2 4 (5) 3 1 * ~ (6) (7) 1 4 5 * ~ (5) 1 1 2 4 * * *

2020-07-07 10:38:40 141

原创 力扣解题思路:荷兰国旗问题/颜色分类问题

75. 颜色分类思路:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。(方法1)暴力排序:冒泡排序法:public void sortColors(int[] nums) { for(int i=0;i<nums.length;i++){ for(int j=0;j<nums.length-i-1;j++){ if(nums[j]>nums[j+1]){

2020-07-06 21:43:50 229

原创 力扣解题思路:695. 岛屿的最大面积

695. 岛屿的最大面积思路:题目要求找到最大的联通面积,这种题目很自然的想到两种解法BFS和DFS,显然这两种解法都是可行的,只是我个人认为更适合DFS因为DFS的核心就是递归,对于递归函数,只要能找到函数的出口,中间递归的过程其实并不重要。(方法1:DFS)首先我们需要找到每一个“1”,找到“1”后调用DFS的递归函数,那么我们每次找到“1”后都需要调用DFS吗?当然不是,每个岛屿只需要调用一次DFS即可,因为每次调用的过程中会访问到该岛屿的所有“1”,所以我们将访问过的“1”置“0”来避免重复访问

2020-07-06 12:33:39 360

原创 力扣解题思路:127. 单词接龙/单词转换 纠错记录

127. 单词接龙思路:找出一条从 beginWord 到 endWord 的最短路径,每次移动规定为改变一个字符,并且改变之后的字符串必须在 wordList 中。从题目中可以看出,当两个单词只相差一个字符,就相当于这两个单词是存在相互连接的一条路径的,那么我们要做的是,找到从beginWord 到 endWord 的最短路径。->显然,我们只需要从 beginWord开始遍历每个节点的邻接节点直到 endWord 即可,中心思想即为BFS。->首先我们需要构造一个判断两个单词是否联通的

2020-07-06 10:35:28 172

原创 力扣解题思路:279. 完全平方数

279. 完全平方数思路:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。(方法1)由于最终结果是平方数不断累加而得的,所以自然联想到动态规划。->令dp[i]表示组成数字i的最小平方数的个数,那么就有递推公式:dp[i] = Math.min(dp[i], dp[i - j * j] + 1)而我们所求即为dp[n],完整代码如下:public int numSquares(int n) { i

2020-07-06 09:50:59 195

原创 力扣解题思路:分治法与递归

241. 为运算表达式设计优先级思路:由给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。我们可以对公式中每个标点符号作为一个分割节点,将公式分成两部分分别加括号,而对这两个部分的每一个部分使用相同的方式进行递归即可。->这样左右两边都会得到一个结果集,将其分别进行组合即可得出最终的结果集,这就是二分法。->另外,为了进一步减少不必要的计算,比如有很多子公式(string)可能会被

2020-07-05 10:17:44 452 1

原创 力扣解题思路:847. 访问所有节点的最短路径

847. 访问所有节点的最短路径思路:此题类似于求最小生成树,要求返回能访问所有结点的最短路径,我们可以把每个点作为出发点,依次访问与该点相连的节点,即使用BFS。->我们需要一个用于记录我们是否访问完所有节点的数组(也需要记录已经访问的节点)book,那book的维度如何确定呢?首先从每个节点出发都会保存一个已遍历的节点的数组,所以book应该是一个二维数组,第一个维度即为节点的数目。->为了便于统计和更新已访问的节点,我们使用boolean[len][1<<len]用来记录

2020-07-04 12:23:37 678 1

原创 力扣解题思路:二分法 纠错记录

二分法每次做题,只要看到题目要求说时间复杂度要不能大于O(logn)我就脑瓜子疼,因为一般这种情况就是需要用到二分法了,二分法的原理其实很简单,就是一次次的找数组中间的mid数,验证其是否满足要求,然后根据实际情况来移动low或者high。然而二分法最头疼的不在于他的原理,而在于他的边界条件的取值,例如while循环的条件中应该是l<h呢还是l<=h呢,以及当mid不满足条件后是h = mid还是h=mid+1还是l = mid还是l=mid+1呢?其实判断这个也是有一定规律的,比如当mid

2020-07-04 11:13:07 446

原创 力扣解题思路:763. 划分字母区间

763. 划分字母区间思路:由题目字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。由此可以想到贪心算法,从第一个字符开始,往后找符合条件的最短字串,然后对后面的字串采用相同的分割方法->那么如何分割呢?从start遍历字符串,找到和起点相同的最后一个字母,查看此区间里的字母最后的end是否超出区间,超出则更新区间,直至找到最大的end则end-start + 1就是所求区间长度,然后更新start。->我们使用Map来存储每个字母的最

2020-07-04 09:21:42 171

原创 力扣解题思路:665. 非递减数列

665. 非递减数列思路:题目要求判断一个数组是否能只修改一个数就成为非递减数组。,当出现 nums[i] < nums[i - 1] 时,需要考虑的是应该修改数组的num[i]还是num[i-1],使得本次修改能使 i 之前的数组成为非递减数组,并且 不影响后续的操作 ->优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的话,那么 nums[i] 这个数会变大,就有可能比 nums[i + 1] 大,从而影响了后续操作。还有

2020-07-03 22:18:06 162

原创 力扣解题思路:股票问题

121. 买卖股票的最佳时机思路:这题为简单题,只要记录前面的最小价格,将这个最小价格作为买入价格,然后将当前的价格作为售出价格,查看当前收益是不是最大收益。class Solution { public int maxProfit(int[] prices) { if(prices.length == 0) return 0; int max = 0; int min = prices[0]; for(int i=1;i

2020-07-03 10:21:17 1426

原创 力扣解题思路:区间排序问题

435. 无重叠区间思路:每次遇到和区间有关的题都要思考半天区间的排序方法,是根据区间左边排序还是根据区间右边排序呢?另外遇到这种题目如果采取贪心算法最后的结果会不会是最优的呢?(主要是因为研究生期间我的研究方向是强化学习算法,其中用到的贪婪算法容易陷入局部最优,所以每次看到适合用贪婪算法解题的题目时总会思考贪婪算法会得出最优解吗?)->首先,分析我们的目标是要找到找到需要移除区间的最小数量,所以想到贪心算法:先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。此时就应该先排序

2020-07-02 11:24:48 1484

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除