![](https://img-blog.csdnimg.cn/20200802085536787.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
文章平均质量分 60
记录刷Leetcode过程中解题思路
涛歌依旧fly
计算机研究生,专注于Java后端技术学习。
——勇敢地奔跑
展开
-
11. 盛最多水的容器
题目描述盛最多水的容器给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:转载 2022-05-19 20:25:16 · 70 阅读 · 0 评论 -
10. 正则表达式匹配
题目描述正则表达式匹配给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入:s = “aa”, p = “a”输出:false解释:“a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”, p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在转载 2022-05-19 19:55:50 · 88 阅读 · 0 评论 -
基于力扣5. 最长回文子串 详解Manacher算法
Manacher算法, 求解最长回文子串. 五颗星.原创 2022-05-19 16:44:51 · 100 阅读 · 0 评论 -
378. 有序矩阵中第 K 小的元素
题目描述378. 有序矩阵中第 K 小的元素难度中等800收藏分享切换为英文接收动态反馈给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。你必须找到一个内存复杂度优于 O(n2) 的解决方案。示例 1:输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8输出:13解释:矩阵中的元素为 [1,5,9,10,11,12,1原创 2022-05-17 13:49:58 · 212 阅读 · 0 评论 -
3. 无重复字符的最长子串
题目描述无重复字符的最长子串难度中等7578收藏分享切换为英文接收动态反馈给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,原创 2022-05-16 11:10:37 · 90 阅读 · 0 评论 -
2. 两数相加
题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9],原创 2022-05-15 22:20:32 · 54 阅读 · 0 评论 -
1.两数之和
题目描述两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4]原创 2022-05-15 21:49:23 · 58 阅读 · 0 评论 -
378. 有序矩阵中第 K 小的元素
题目378. 有序矩阵中第 K 小的元素思路转换时间 和输出负载原创 2021-04-07 09:44:26 · 153 阅读 · 0 评论 -
leetcode 338. 比特位计数
题目338. 比特位计数思路这道题其实用的是动态规划思想,状态:res[i]表示数为i时,二进制1的数目大小。状态转移方程,这道题是关于二进制1的个数,所以需要考虑位运算的相关思想,比较清晰的思路是分奇数、偶数来进行判断:奇数:二进制的1的个数就是比偶数多1个,因为就多了末尾的1.(偶数的二进制末尾都是0) 0(0): 0 1(1) : 1 2(10): 1 3(11): 2偶数:二进制的末尾是0,而如果除以2,那么就是去掉二进制末尾的一个0,如6(110),除以2,原创 2021-04-04 22:07:33 · 81 阅读 · 0 评论 -
leetcode 318. 最大单词长度乘积
题目318. 最大单词长度乘积思路检查两个字符串是否具有字符交集。如果没有,求字符串数组中两个字符串长度之积的最大值。每个字符串只由小写字母组成,我们可以用分别用数组记录字符串各个字符是否出现,数组的大小即为26,对于同一个字符串,出现了重复字符无所谓,但是两个字符串之间不能出现字符交集即可。class Solution { public int maxProduct(String[] words) { int maxLen = 0; for(int i =原创 2021-04-03 22:12:30 · 190 阅读 · 0 评论 -
leetcode 371. 两整数之和
题目371. 两整数之和不使用运算符 + 和 - ,计算两整数 a 、b 之和。示例 1:输入: a = 1, b = 2输出: 3示例 2:输入: a = -2, b = 3输出: 1思路不用+、-,那就用位运算的符号来进行加法运算。异或运算已经很接近加法运算了:如下00110101 ^————0110相同为0,相异为1。上面的结果是,加法得到的不考虑进位的中间结果A。但是加法的最终结果是需要考虑进位的。加法用异或运算,这个很原创 2021-04-03 19:47:21 · 138 阅读 · 0 评论 -
LeetCode 476. 数字的补数
题目476. 数字的补数给你一个 正 整数 num ,输出它的补数。补数是对该数的二进制表示取反。示例 1:输入:num = 5输出:2解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。示例 2:输入:num = 1输出:0解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。提示:给定的整数 num 保证在 32 位带符号整数的范围内。num >= 1你可以假定二进制数不包含前导零位。本题与 1009原创 2021-04-01 13:26:40 · 149 阅读 · 0 评论 -
leetcode 693. 交替位二进制数
题目693. 交替位二进制数给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例 1:输入:n = 5输出:true解释:5 的二进制表示是:101示例 2:输入:n = 7输出:false解释:7 的二进制表示是:111.示例 3:输入:n = 11输出:false解释:11 的二进制表示是:1011.示例 4:输入:n = 10输出:true解释:10 的二进制表示是:1010.示例 5:输入:n =原创 2021-03-31 10:29:13 · 159 阅读 · 0 评论 -
leetcode 342. 4的幂
题目342. 4的幂给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n==4xn == 4^xn==4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true提示:−231<=n<=231−1-2^{31} <= n <= 2^{31} - 1−231<=n<=23原创 2021-03-31 09:41:22 · 106 阅读 · 0 评论 -
LeetCode231. 2的幂
题目231. 2的幂给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false思路二进制表示只有一个1存在。负数绝对不是2的幂次方,2的幂次方是大于0的。检查二进制是否只有一个1存在,函数有Integer.bitCount()。class Solution { public boolean isPowerOfT原创 2021-03-31 09:19:24 · 87 阅读 · 0 评论 -
leetcode190 颠倒二进制位
题目190. 颠倒二进制位颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。进阶:如果多次调用这个函数,你将如何优化你的算法?示例原创 2021-03-30 21:17:30 · 113 阅读 · 0 评论 -
leetcode260 只出现一次的数字
题目260. 只出现一次的数字 III给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?示例 1:输入:nums = [1,2,1,3,2,5]输出:[3,5]解释:[5, 3] 也是有效的答案。示例 2:输入:nums = [-1,0]输出:[-1,0]示例 3:输入:nums = [0,1]输出:[1,0]提示:原创 2021-03-30 20:39:12 · 126 阅读 · 0 评论 -
leetcode268 丢失的数字
题目268. 丢失的数字给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数原创 2021-03-29 09:26:48 · 120 阅读 · 0 评论 -
leetcode136 只出现一次的数字
题目136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4思路 异或两个相同的数异或为0一个数与0异或为这个原来数因此将数组所有的数异或即可得到只出现一次的元素。class Solution { public int singleNu原创 2021-03-29 08:58:24 · 77 阅读 · 0 评论 -
leetcode461 汉明距离
题目461. 汉明距离两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.示例:输入: x = 1, y = 4输出: 2解释:上面的箭头指出了对应二进制位不同的位置。思路利用异或(相同为0,相异为1),可以得到一个新的数,对应二进制1的个数恰好为两个整数二进制不同位置的数目。然后利用Integer.bitCount() 来统计1的个数即可。class Solution {原创 2021-03-28 20:23:34 · 143 阅读 · 0 评论 -
leetcode309最佳买卖股票时机含冷冻期
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格。设计一个算法计算出最大利润。搞清楚有哪些状态,以及状态怎么转移。画个图,看第iii天的三种状态的可能转移情况。注意:此题需要考虑冷却期。题目给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示原创 2020-10-28 21:36:16 · 150 阅读 · 0 评论 -
【LeetCode】两百道经典题解 (1)
文章目录算法双指针1、两数之和(Easy)暴力法哈希法一次哈希法双指针法2、平方数之和(Easy)双指针法3、反转字符串中的元音字母(Easy)双指针法思路一思路二4、验证回文字符串 Ⅱ(Easy)双指针法5、合并两个有序数组[Easy]双指针法6、环形链表(Easy)7、通过删除字母匹配到字典里最长单词(Easy)排序堆快速选择1、数组中的第K个最大元素(Medium)堆快速选择桶排序1、前 K 个高频元素(Medium)2、根据字符出现频率排序荷兰国旗问题1、按颜色进行排序贪心1 分发饼干(Easy)2原创 2020-08-16 11:15:35 · 2110 阅读 · 0 评论 -
leetcode 416. 分割等和子集
0-1背包// W 为背包总体积// N 为物品数量// weights 数组存储 N 个物品的重量// values 数组存储 N 个物品的价值public int knapsack(int W, int N, int[] weights, int[] values) { int[][] dp = new int[N + 1][W + 1]; for (int i = 1; i <= N; i++) { int w = weights[i - 1], v原创 2020-08-08 09:52:32 · 128 阅读 · 1 评论 -
leetcode1143 最长公共子序列
最长公共子序列题目链接:最长公共子序列class Solution { public int longestCommonSubsequence(String text1, String text2) { int n = text1.length(),m = text2.length(); int[][] dp = new int[n + 1][m + 1]; for(int i = 1;i <= n; i++){原创 2020-08-08 09:23:37 · 231 阅读 · 0 评论 -
leetcode646 最长数对链
题目描述题目思路首先,这一题求的是最长数对链的长度,需要先对所有数对进行排序,按照每个数对的第一个数进行从小到大的排序,然后使用动态规划的方法:状态–》dp[i]表示数对i的最长数对链的长度转移方程–》dp[i] = max(1 + dp[j]) i < j 并且pairs[j][1] < pairs[i][0]class Solution { public int findLongestChain(int[][] pairs) { Arrays.sort(原创 2020-08-05 22:02:55 · 211 阅读 · 0 评论 -
leetcode300 最长上升子序列
题目描述题目思路使用动态规划算法的思想,首先状态的定义:dp[n]表示以s[n]结尾的最长递增子序列的长度。那么dp[n]的由来就是s[n]之前存在的一条最长递增子序列的长度+1。所以转移方程就是:dp[n] = max(dp[i] + 1| s[i] < s[n] && i < n)。当然,也可能存在s[n]之前没有递增子序列,所以dp[n]=1的情况也是可能发生的。所以,对于序列的每一个dp来说,初始值应该都是1。(dp[i] = 1 | 1 <=i <原创 2020-08-05 20:31:46 · 157 阅读 · 0 评论 -
leetcode91 解码方法
题目描述一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: “12”输出: 2解释: 它可以解码为 “AB”(1 2)或者 “L”(12)。示例 2:输入: “226”输出: 3解释: 它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。思路问方案数,就用动态规划, 比如前面的一题413原创 2020-08-03 11:19:16 · 236 阅读 · 0 评论 -
LeetCode279 完全平方数
状态: F(n) 表示 若干个完全平方数的和等于n,所得完全平方数的最少个数.转移方程: F(n) = 1 + min(F(n - i)) 1<=i <=n,其中i是平方数。数组表示如下:memory[i] = min(memory[i],1 + memory[i - j])其中如果memory[i]为初始状态时,直接:memory[i] = 1 + memory[i - j])。代码如下:class Solution { public int numSquares(int原创 2020-08-03 07:49:11 · 175 阅读 · 0 评论 -
LeetCode343 整数拆分
题目描述给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。题目思路这道题的做法是采用动态规划, 状态: F(i)代表一个整数i被拆分成至少两个正整数之后,乘积的最大值。那么难点在于如何确定状态方程。原创 2020-08-02 15:45:13 · 231 阅读 · 0 评论 -
【LeetCode】寻找两个正序数组的中位数
参考博客:https://blog.csdn.net/chen_xinjia/article/details/69258706class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int MIN_VALUE = 0x80000000; int MAX_VALUE = 0x7FFFFFFF; int N1 = nums1.length;原创 2020-06-20 16:55:53 · 196 阅读 · 0 评论 -
【Leetcode】无重复字符的最长子串
用到的思想是【滑动窗口】维护一个队列,使得队列符合题目要求。例如字符串“pwwkew”,那么队列“pw”、“wke”可以,“pww”、“wkew”就不行。将不满足要求的队列中重复的字符移除队列即可。假设一个原始、题目给定的字符串S1,我们通过两个指针left、i 维护一个队列S2, 设指针left指向S2左端,i指向S2的右端,当加入的字符与S2中的字符重复了,就更新left,使得【窗口】或【队列】往右滑,去掉重复的字符。每次更新队列的长度,更新最大值max,这样最后的max就是答案。clas原创 2020-06-20 11:57:59 · 137 阅读 · 0 评论 -
【LeetCode】hot100 2-两数相加
题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路采用双指针,每次两个值相加尤其要注意进位。并且当遍历完两个原创 2020-06-06 11:48:30 · 228 阅读 · 0 评论