
LeetCode
文章平均质量分 55
按专题刷题学习笔记
一杯红酒7
这个作者很懒,什么都没留下…
展开
-
位运算 - 统计从 0 ~ n 每个数的二进制表示中 1 的个数
1.题目LeetCode;338. 比特位计数【medium】2.解题方法一:动态规划参考:https://leetcode-cn.com/problems/counting-bits/solution/bi-te-wei-ji-shu-by-leetcode-solution-0t1i/java:class Solution { public int[] countBits(int num) { int[] res = new int[num + 1];原创 2021-04-06 20:20:30 · 303 阅读 · 0 评论 -
位运算 - 字符串数组最大乘积
1.题目LeetCode: 318. 最大单词长度乘积【medium】2.解题方法一:首先将字符串数组转成整数数组,然后找出符合要求的两个字符串,即他们的与的结果为0,然后找出乘积最大的即可。java:class Solution { public int maxProduct(String[] words) { int res = 0; int[] nums = new int[words.length]; for (int i = 0原创 2021-04-06 20:19:24 · 292 阅读 · 0 评论 -
位运算 - 实现整数的加法
1.题目LeetCode: 371. 两整数之和【medium】2.解题方法一:递归法a ^ b求得两个数的和, (a & b) << 1求得进位,和与进位不断求和,直至进位为0停止。java:class Solution { public int getSum(int a, int b) { return b == 0 ? a : getSum((a ^ b), (a & b) << 1); }}...原创 2021-04-06 20:18:08 · 125 阅读 · 0 评论 -
位运算 - 翻转一个数的比特位
1.题目LeetCode: 190. 颠倒二进制位【easy】2.解题方法一:java:public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { int res = 0; for (int i = 0; i < 32; i++) { res <<= 1;原创 2021-04-06 20:09:23 · 552 阅读 · 0 评论 -
位运算 - 判断一个数是不是 2 的 n 次方
题目LeetCode:231. 2的幂【easy】2.解题方法一:递归法java:class Solution { public boolean isPowerOfTwo(int n) { if (n == 1) return true; return n > 1 && isPowerOfTwo(n / 2) && (n % 2) != 1; }}方法二:计数对于一个数的二进制表示,如果这个数是2的幂,原创 2021-04-06 20:11:04 · 379 阅读 · 0 评论 -
位运算 - 判断一个数是不是 4 的 n 次方
1.题目LeetCode: 342. 4的幂【easy】2.解题方法一:递归法java:class Solution { public boolean isPowerOfFour(int n) { if (n == 1) return true; return n > 0 && isPowerOfFour(n / 4) && (n % 4) == 0; }}方法二:位运算java:class Solu原创 2021-04-06 20:12:27 · 293 阅读 · 0 评论 -
位运算 - 数组中不重复的两个元素
1.题目LeetCode: 260. 只出现一次的数字 III【medium】2.解题*方法一:位运算 - 异或两个不相等的元素在位级表示上必定会有一位存在不同。将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。换句话说,通过diff &= -diff 得到出 diff 最右侧不为 0 的位,通过这一原创 2021-04-06 20:08:20 · 354 阅读 · 0 评论 -
位运算 - 求一个数的补码
1.题目LeetCode:476. 数字的补数【easy】2.解题方法一:掩码异或由题可知补数是原数二进制的取反,所以比如5的二进制是0101,与0111进行异或操作结果是0010.因此我们求得掩码即可java:class Solution { public int findComplement(int num) { int mask = 1; mask <<= 30; while ((num & mask) == 0原创 2021-04-06 20:14:54 · 452 阅读 · 0 评论 -
位运算 - 找出数组中缺失的那个数
1.题目LeetCode: 268. 丢失的数字【easy】2.解题方法一:异或分析题意,长为n的数组包含0到n的n个数,将所有数与数组下标进行异或操作,剩下的结果是多余的数组下标,即丢失的元素。java:class Solution { public int missingNumber(int[] nums) { int res = 0; for (int i = 0; i < nums.length; i++) { re原创 2021-03-30 20:24:47 · 623 阅读 · 0 评论 -
位运算 - 数组中唯一一个不重复的元素
1.题目LeetCode:136. 只出现一次的数字【easy】2.解题方法一:异或两个相同的数异或为0,0与任何数异或为任何数,所以我们可以对所有数进行异或操作,相同的数会抵消掉,最后剩下的便是我们要的结果。java:class Solution { public int singleNumber(int[] nums) { int res = 0; for (int i = 0; i < nums.length; i++) {原创 2021-03-30 20:23:54 · 484 阅读 · 0 评论 -
位运算 - 统计两个数的二进制表示有多少位不同
1.题目LeetCode;461. 汉明距离【easy】2.解题方法一:Integer.bitCount()两个数进行异或操作,便可得到不同的位置的数目,然后直接使用java中计算二进制数的1的个数。java:class Solution { public int hammingDistance(int x, int y) { return Integer.bitCount(x ^ y); }}方法二:计数法异或之后计数,但超出时间限制。public原创 2021-03-30 20:22:28 · 269 阅读 · 0 评论 -
图 - 并查集 - 冗余连接
1.题目LeetCode: 684. 冗余连接【medium】2.解题方法一:并查集参考:https://leetcode-cn.com/problems/redundant-connection/solution/rong-yu-lian-jie-by-leetcode-solution-pks2/java:class Solution { public int[] findRedundantConnection(int[][] edges) { int cou原创 2021-03-30 20:21:21 · 124 阅读 · 0 评论 -
图 - 拓扑排序 - 课程安排的合法性
1.题目LeetCode: 207. 课程表【medium】2.解题方法一:DFS参考:https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/java:class Solution { List<List<Integer>> edges; int[] visited; boolean valid = true;原创 2021-03-30 20:19:28 · 156 阅读 · 0 评论 -
图 - 二分图 - 判断是否为二分图
1.题目LeetCode: 785. 判断二分图【medium】2.解题方法一:DFS根据题意,图中任意两个相连的节点必定属于不同的集合。我们可以通过染色的方式进行解答,从任意一个节点开始,将其染成红色(0),然后将他相连的其他节点都染成绿色(1),然后遍历下一个节点,如果是绿色就将其相连的节点染成红色,否则染成绿色,以此类推,直到遍历完所有节点,如果产生冲突即本该染红色的节点已经被染成了绿色,则直接返回false,不符合二分图,反之亦然。算法的流程如下:我们任选一个节点开始,将其染成红色,原创 2021-03-30 20:18:22 · 410 阅读 · 0 评论 -
数组与矩阵 - 分隔数组
1.题目LeetCode: 769. 最多能完成排序的块【medium】数组arr是[0, 1, …, arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [4,3,2,1,0]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2]原创 2021-03-30 20:17:18 · 142 阅读 · 0 评论 -
数组与矩阵 - 嵌套数组
1.题目LeetCode: 565. 数组嵌套【medium】索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。示例 1:输入: A = [5,4,0,3,1,6,2]输出: 4解释:A[原创 2021-03-28 19:56:08 · 251 阅读 · 0 评论 -
数组与矩阵 - 对角元素相等的矩阵
1.题目LeetCode: 766. 托普利茨矩阵【easy】给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。示例 1:输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]输出:true解释:在上述矩阵中, 其对角线为:“[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”原创 2021-03-28 19:54:33 · 3266 阅读 · 0 评论 -
数组与矩阵 - 数组的度
1.题目LeetCode: 697. 数组的度【easy】给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3]原创 2021-03-28 19:53:14 · 182 阅读 · 0 评论 -
数组与矩阵 - 数组相邻差值的个数
1.题目LeetCode: 667. 优美的排列 II【medium】给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:① 如果这个数组是 [a1, a2, a3, … , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数;.② 如果存在多种答案,你只需实现并返回其中任意一种.示例 1:输入: n = 3, k = 1输出: [原创 2021-03-28 19:52:12 · 306 阅读 · 0 评论 -
数组与矩阵 - 找出数组中重复的数,数组值在 [1, n] 之间
1.题目LeetCode: 287. 寻找重复数【medium】给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3示例 3:输入:nums = [1,1]输出:1示例 4:输入:nums = [1,1,2]输出:1提原创 2021-03-28 19:50:37 · 419 阅读 · 0 评论 -
数组与矩阵 - 错误的集合
1.题目LeetCode: 645. 错误的集合【easy】集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组 nums 代表了集合 S 发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。示例 1:输入:nums = [1,2,2,4]输出:[2,3]示例 2:输入:nums = [1,1]输出:[1,2]提示:2原创 2021-03-28 19:48:52 · 132 阅读 · 0 评论 -
数组与矩阵 - 有序矩阵的 Kth Element
1.题目LeetCode: 378. 有序矩阵中第 K 小的元素【medium】给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。示例 1:输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8输出:13解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素原创 2021-03-28 19:47:17 · 281 阅读 · 0 评论 -
数组与矩阵 - 找出数组中最长的连续 1
1.题目LeetCode: 485. 最大连续 1 的个数【easy】给定一个二进制数组, 计算其中最大连续 1 的个数。示例:输入:[1,1,0,1,1,1]输出:3解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.提示:输入的数组只包含 0 和 1 。输入数组的长度是正整数,且不超过 10,000。2.解题方法一:一次遍历java:class Solution { public int findMaxConsecutiveOnes原创 2021-03-28 19:42:55 · 1062 阅读 · 0 评论 -
数组与矩阵 - 改变矩阵维度
1.题目LeetCode: 566. 重塑矩阵【easy】在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。示例 1:输入:nums =[[1,2],[3,4]]r = 1,原创 2021-03-28 19:35:58 · 300 阅读 · 0 评论 -
数组与矩阵 - 把数组中的 0 移到末尾
1.题目LeetCode: 283. 移动零【easy】给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。2.解题方法一:暴力法java:class Solution { public void moveZeroes(int[] nums) { int len = nums.leng原创 2021-03-27 08:36:52 · 278 阅读 · 0 评论 -
字符串 - 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
1.题目LeetCode: 696. 计数二进制子串【easy】给定一个字符串 s,计算具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是连续的。重复出现的子串要计算它们出现的次数。示例 1 :输入: “00110011”输出: 6解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。另外,“00110011”不原创 2021-03-26 09:52:33 · 2437 阅读 · 0 评论 -
字符串 - 回文子字符串个数
1.题目LeetCode: 647. 回文子串【medium】给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:“abc”输出:3解释:三个回文子串: “a”, “b”, “c”示例 2:输入:“aaa”输出:6解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”提示:输入的字符串长度不会超过 1000 。2.解题方法一:暴力查找每一个原创 2021-03-26 09:49:03 · 1946 阅读 · 0 评论 -
字符串 - 字符串同构
1.题目LeetCode: 205. 同构字符串【easy】给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。示例 1:输入:s = “egg”, t = “add”输出:true示例 2:输入:s = “foo”, t = “bar”输出:false示例 3:原创 2021-03-26 09:42:22 · 350 阅读 · 0 评论 -
字符串 - 计算一组字符集合可以组成的回文字符串的最大长度
1.题目LeetCode:409. 最长回文串【easy】给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:“abccccdd”输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。2.解题方法一:数组因为回文数组左右的字符是一样的,所以左右的字符必定为偶数个,而中间的字符既原创 2021-03-26 09:39:52 · 1008 阅读 · 0 评论 -
字符串 - 两个字符串包含的字符是否完全相同
1.题目LeetCode: 242. 有效的字母异位词【easy】给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?2.解题方法一:HashMap将s中所有字原创 2021-03-26 09:36:37 · 1219 阅读 · 0 评论 -
哈希表 - 最长连续序列
1.题目LeetCode: 128. 最长连续序列【hard】给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。进阶:你可以设计并实现时间复杂度为 O(n) 的解决方案吗?示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9提示:0<=nums.length&l原创 2021-03-24 10:41:01 · 242 阅读 · 0 评论 -
哈希表 - 最长和谐序列
1.题目LeetCode: 594. 最长和谐子序列【easy】和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例 1:输入:nums = [1,3,2,2,5,2,3,7]输出:5解释:最长的和谐子序列是 [3,2,2,2,3]示例 2:输入:nums = [1,2,3,原创 2021-03-24 10:29:37 · 278 阅读 · 0 评论 -
哈希表 - 判断数组是否含有重复元素
1.题目LeetCode: 217. 存在重复元素【easy】给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true2.解题方法一:HashSet遍历数组,每遍历一个元素就判断是否在哈希表中,如原创 2021-03-24 10:26:10 · 2873 阅读 · 0 评论 -
哈希表 - 数组中两个数的和为给定值
1.题目LeetCode: 1. 两数之和【easy】给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [原创 2021-03-24 10:20:40 · 424 阅读 · 0 评论 -
栈和队列 - 循环数组中比当前元素大的下一个元素
1.题目LeetCode: 503. 下一个更大元素 II【medium】给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结原创 2021-03-24 10:13:34 · 302 阅读 · 0 评论 -
栈和队列 - 数组中元素与下一个比它大的元素之间的距离
1.题目LeetCode: 739. 每日温度【medium】请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的原创 2021-03-24 09:41:04 · 186 阅读 · 0 评论 -
栈和队列 - 用栈实现括号匹配
1.题目LeetCode: 20. 有效的括号【easy】给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}原创 2021-03-24 09:08:27 · 469 阅读 · 0 评论 -
栈和队列 - 最小栈
1.题目LeetCode: 155. 最小栈【easy】设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],原创 2021-03-24 08:47:52 · 158 阅读 · 0 评论 -
栈和队列 - 用队列实现栈
1.题目LeetCode: 225. 用队列实现栈【easy】请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 p原创 2021-03-24 08:41:28 · 223 阅读 · 0 评论 -
栈和队列 - 用栈实现队列
1.题目LeetCode: 232. 用栈实现队列【easy】请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有原创 2021-03-24 08:37:26 · 159 阅读 · 0 评论