![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LEETCODE
刷题的一些思路
若木方林
这个作者很懒,什么都没留下…
展开
-
【LLETCCODE】32.最长有效括号
题目给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。思路判断有效的字符长度,很容易想到使用栈结构。如果是“(”:则将左括号的下标推入栈中;如果是“)”:如果栈为空,证明此时右括号是非法的,将右括号的下标推入栈中,作为下一个有效括号的起点前一个坐标;如果栈不为空,即有效括号的长度为栈弹出最上层栈中内容后,maxLen=Math.max(maxLen,i-stack.peek()).代码class Solution { public int longe原创 2020-07-04 10:26:48 · 2236 阅读 · 0 评论 -
【LEETCODE】718.最长重复子数组-动态规划+滑动窗口
题目给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。思路设数组A长度为n,B长度为m动态规划:设置动态规划数组dp[n+1][m+1],dp[n][m]=0。从A[n-1]和B[m-1]开始向前遍历比较,可以得出伪代码:if A[i]==B[j]: dp[i][j]=dp[i+1][j+1]+1;else if A[i]!=B[j]: dp[i][j]=0;滑动窗口:滑动窗口的示意图如下图所示:代码...原创 2020-07-01 18:37:56 · 216 阅读 · 0 评论 -
【LEETCODE】209.长度最小的子数组
题目给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。思路找到最小的连续子数组,最少需要遍历一次数组。且连续子数组可以通过两个指针进行指示。因此想到使用双指针法来完成本题。代码class Solution { public int minSubArrayLen(int s, int[] nums) { //O(n)双指针 int n=nums.le原创 2020-06-28 09:26:14 · 79 阅读 · 0 评论 -
【LLETCODE】124.二叉树中的最大路径和
题目给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。思路先考虑一个7个节点的完全二叉树。想要遍历所有可能的路径,可以采用后序遍历的方法由上至下遍历。因为需要找到最大路径和,在遍历一个节点时,需要找到路径和最大的分支,对应的思路为:1.路径和应当pathVal>=0,当路径和小于0时,就以该节点为路径的起始点。2.如果该点的左右分支均大于0,此时应当返回左、右分支中较大的一支与该节点值的和。原创 2020-06-21 10:09:37 · 123 阅读 · 0 评论 -
【LEETCODE】125.验证回文串
题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。分析使用双指针的方法遍历整个字符串,判断字符串是否是回文字符串。几个要点:1.Character.isLetterOrDigit()用来判断当前字符是否是字母和数字字符。2.Character.toLowerCase()将大写字母转化为小写字母,再进行比较。代码class Solution { public boolean isPalindrome(String s) { int le原创 2020-06-19 09:12:35 · 60 阅读 · 0 评论 -
【LEETCODE】二叉树的序列化和反序列化
题目序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。思路使用递归实现二叉树前序遍历和反序列化。代码/** * Definition for a binary tree node. * publ原创 2020-06-16 11:11:41 · 146 阅读 · 0 评论 -
【LEETCODE】739.每日温度
题目根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。思路思路一(暴力解法):在每一个时间节点i向后找原创 2020-06-11 09:50:49 · 82 阅读 · 0 评论 -
【LEETCODE】9.回文数
题目判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。思路题目要求不能使用字符串解决,很自然的想到将数字分成前半部分和后半部分。将后半部分反转后与前半部分进行比较,如果两者一直则是回文数。这对于int类型而言是很容易实现的,因为后半部分可以通过x%10得到最后一位的值,前半部分则可以通过x/10去掉最后一位值。退出循环的条件是:后半部分的值>前半部分的值。特殊情况:int为负数时,一定不是回文数;int的最后一位是0时,一定不是回文数。通过上述思原创 2020-06-10 10:00:04 · 72 阅读 · 0 评论 -
【LEETCODE】46.把数字翻译成字符串
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路使用动态规划。判断第i个字符时,需要判断str.substring(i-1,i+1)对应的数字是否有对应的字母。如果有,则当前的翻译方法dp[i]=dp[i-2]+dp[i-1];如果没有,则当前的翻译方法dp[i]=dp[i-1]。代码class Solutio原创 2020-06-09 16:50:26 · 78 阅读 · 0 评论 -
【LEETCODE】990.等式方程的可满足性
题目给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。思路将等式两端的字母建立为并查集,然后检查不等式中是否有并查集中的连通分量。代码class Solution { public boolean equationsPo原创 2020-06-08 16:55:25 · 85 阅读 · 0 评论 -
【LEETCODE】128.最长连续序列
题目给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。思路一次遍历无法找到整个连续序列最长的子序列。如果使用暴力解法需要O(n^2),不满足题目要求。因此考虑使用哈希表解决问题。1.遍历一次数组,将数组中所有数据入哈希表;2.找到序列最长的子序列:因为要求时间复杂度最小,因此需要避免一个子序列中的多个元素被重复判断多次。解决这个问题的方法是:每次判断前,确定当前数据num没有前驱,即不存在numSet.constains(num-1)。这样可以保证每一个子原创 2020-06-06 09:43:15 · 83 阅读 · 0 评论 -
【LEETCODE】238.除自身以外数组的乘积
题目给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。请不要使用除法,且在 O(n) 时间复杂度内完成此题。思路由于不能使用除法,且要在O(n)时间复杂度内完成题目。因此将每一个数组位置对应的乘积值转化为output[i]=i左侧的所有数乘积*i右侧的所有数乘积。计算左侧的乘积,可以让数组从前向后循环,即可完成;但是一次循环无法同时完成左侧和右侧的统计,因此需要从后原创 2020-06-04 09:32:37 · 80 阅读 · 0 评论 -
【LEETCODE】面试题64. 求1+2+…+n
题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路不使用乘除法计算1+2+…+n,自然地想到要使用循环完成代码。又由于不能使用题目上述关键字和判断语句,于是可以想到使用递归代替循环操作。代码class Solution { public int sumNums(int n) { boolean flag=n>0&&(n+=sumNums(n-1))<原创 2020-06-02 09:25:17 · 119 阅读 · 1 评论 -
【LEETCODE】101. 对称二叉树
题目给定一个二叉树,检查它是否是镜像对称的。思路采用递归的思路,进行迭代完成。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean原创 2020-05-31 10:55:40 · 71 阅读 · 0 评论 -
【LEETCODE】198.打家劫舍
题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。思路打家劫舍的问题首先要想到动态规划。定义数组dp[n].在数组第i(i>1)位,有两种可以选择的情况:打劫该位,则此位置dp[i]=dp[i-2]+nums[i];不打劫该位,则dp[i]=d原创 2020-05-29 09:09:35 · 224 阅读 · 0 评论 -
【LEETCODE】974. 和可被 K 整除的子数组
题目给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。思路涉及连续子数组的问题,考虑使用前缀和解决问题。即存储A[0]至当前数组项的和sum。本题中,(A[j]-A[i])%K==0时,表示该区间为符合条件的子数组,即A[j]和A[i]有相同的余数。=>根据上述分析将该题转化为:查找当前数组所有前缀和余数相同的项目。代码class Solution { public int subarraysDivByK(int[] A, int K) {原创 2020-05-27 09:54:43 · 157 阅读 · 0 评论 -
【LEETCODE】105. 从前序与中序遍历序列构造二叉树
题目根据一棵树的前序遍历与中序遍历构造二叉树。思路递归思路参考官方视频讲解代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { private Map<I原创 2020-05-22 11:50:38 · 105 阅读 · 0 评论 -
【LEETCODE】5. 最长回文子串
题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。思路使用中心扩展算法。字符串每个字符为起点,有两种可能的回文子串。第一是以i为中心,第二是以(i,i+1)为中心。所以将每个字符的两种情况为中心,向外扩展,直到到达边界或者字符不是回文子串为止。代码class Solution { public String longestPalindrome(String s) { int len = s.length(); i原创 2020-05-21 11:14:03 · 80 阅读 · 0 评论 -
【LEETCODE】152.乘积最大子数组
题目给定一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。思路使用动态规划方法。最朴素的想法,需要将每一种子数组都考虑到,即时间复杂度为O(n^2)。如何降低时间复杂度呢?最理想化的算法也需要遍历一次数组,即O(n)。求相邻数组的最大值,在第i个位置只有两种取值的可能性:(1)取nums[i]值;(2)nums[i-1]时的最大值与nums[i]相乘,即maxNum[i-1]*nums[i];此题还有一个特殊情况,就是数原创 2020-05-18 17:04:50 · 185 阅读 · 0 评论 -
【LEETCODE】680.验证回文字符串Ⅱ
题目给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。思路验证是否是回文字符,至少需要O(n)的时间复杂度。因为至多删除一个字符,因此在删除一个字符之后,进行判断剩下的字符是否能构成回文字符串即可。代码class Solution { public boolean validPalindrome(String s) { int len = s.length(); //最少时间复杂度:O(n) int lo = 0;原创 2020-05-19 12:13:36 · 113 阅读 · 0 评论 -
【LEETCODE】1371. 每个元音包含偶数次的最长子字符串
题目给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。思路如何标识元音所在位置?(1) 前缀和:使用A[i][k]记录元音所在位置,其中i为元音在字符串中的位置,k为元音的标识(即a,e,i,o,u分别对应k=0,1,2,3,4)。(2)状态压缩:根据题目要求,不需要知道元音的具体数目,所以可以将前缀和的思路进行简化——使用二进制位运算标识元音的奇偶数。例如在第i个位置(a,e,i,o,原创 2020-05-20 16:29:56 · 165 阅读 · 0 评论 -
【LEETCODE】199. 二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。思路使用深度优先算法,找到每一层节点最右端的节点,加入到队列中。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...原创 2020-04-22 09:45:56 · 75 阅读 · 0 评论 -
【LEETCODE】200. 岛屿数量
题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。思路可以使用使用深度优先遍历和广度优先遍历。TIPS:网格类的题目基本都可以考虑使用广度优先遍历进行解决。代码以广度优先遍历为例进行代码的演示。class Soluti...原创 2020-04-20 10:13:30 · 74 阅读 · 0 评论 -
【LEETCODE】55.跳跃游戏
题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。思路使用贪心算法:从数组最后一个开始遍历,找到最靠前的可以遍历到的位置。如果lastPos==0证明可以从第一个位置到达最后一个位置。代码class Solution { public boolean canJump(int[] nums)...原创 2020-04-17 10:18:52 · 105 阅读 · 0 评论 -
【LEETCODE】56.合并区间
题目给出一个区间的集合,请合并所有重叠的区间。思路将数组按照起始区间排序:Arrays.sort(intervals,(o1, o2)->o1[0]-o2[0]);while循环找到重叠的区间,使用list进行存储。代码class Solution { public int[][] merge(int[][] intervals) { //将集合起始的...原创 2020-04-16 10:49:07 · 96 阅读 · 0 评论 -
【LEETCODE】542.矩阵
题目给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。思路矩阵找最近距离的题目,首先考虑广度优先遍历算法。最短距离是从0点开始逐层向外扩散,所以以所有值为0的节点为第一层逐渐向外遍历。一些tips:(1) 矩阵的规格为dp[n][m]时,dp[i][j]的位置可以用一个int表示:int sum = i*m+j。(2) 广度优先遍...原创 2020-04-15 10:45:00 · 370 阅读 · 0 评论 -
【LEETCODE】445.两数相加II
题目给你两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。思路需要逆序处理时,首先靠考虑使用栈来解决。将所有的链表数据压入栈中,然后再依次取出进行计算。代码/** * Definition for singly-linked list. * publ...原创 2020-04-14 18:34:06 · 69 阅读 · 0 评论 -
GOOGLE面试经典题目——鸡蛋掉落/动态规划+二分查找
【LEETCODE】887.鸡蛋掉落[2020/4/11]题目思路难点动态规划+二分查找代码题目K=鸡蛋数量;N=楼层高度;X=从X层扔下;F=鸡蛋破碎的临界值;求知道F的min移动次数思路难点不能直接用二分法——因为有鸡蛋的数量限制;在特殊情况下,二分法也不一定是最好的方法。example:K=2, N=100 , F=49 => 从50层开始二分,如果...原创 2020-04-11 16:13:10 · 374 阅读 · 0 评论