leetcode专栏下置顶文章,为刷题做一个记录,按照leetcode官网题库栏目右侧的“标签分类”,每个分类做一个表格,记录做过的题,不记录解法,持续更新。。。
字符串
题目编号 | 题目名称 | 难度等级 | 做题日期 | 应用 | 解题思路 |
---|---|---|---|---|---|
1576 | 替换所有的问号 | 简单 | 2020-02-22 | 可以生成一个字母组成的字符间不重复的字符串 | 通过判断字符串中一个字符前后的字符是否和该字符相同 |
459 | 重复的子字符串 | 简单 | 2020-02-23 | 判断一个字符串是否完全由一个子字符串组成 | ![]() |
1370 | 上升下降字符串 | 简单 | 2020-02-24 | 将一个无序字符串排序为升降升降…类型的字符串 | https://leetcode-cn.com/problems/increasing-decreasing-string/solution/1370-shang-sheng-xia-jiang-zi-fu-chuan-b-rhsr/ |
面试题 01.06 | 字符串压缩 | 简单 | 2020-02-25 | 判断一个由连续子字符串组成的字符串中的子字符串字符的重复次数 | https://leetcode-cn.com/problems/compress-string-lcci/solution/mian-shi-ti-0106-zi-fu-chuan-ya-suo-by-x-eyjl/ |
1374 | 生成每种字符都是奇数个的字符串 | 简单 | 2020-02-27 | 生成每种字符都是奇数个的字符串 | https://leetcode-cn.com/problems/generate-a-string-with-characters-that-have-odd-counts/solution/1374-sheng-cheng-mei-chong-zi-fu-du-shi-34ylg/ |
859 | 亲密字符串 | 简单 | 2020-02-27 | 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果 | https://leetcode-cn.com/problems/buddy-strings/solution/859-qin-mi-zi-fu-chuan-by-xiaogd-3add/ |
5689 | 统计匹配检索规则的物品数量 | 简单 | 2020-02-28 | 通过对字符串的判断过滤出集合中的部分元素 | https://leetcode-cn.com/problems/count-items-matching-a-rule/solution/5689-tong-ji-pi-pei-jian-suo-gui-ze-de-w-fcqs/ |
数组
题目编号 | 题目名称 | 难度等级 | 做题日期 | 应用 | 解题思路 |
---|---|---|---|---|---|
867 | 转置矩阵 | 简单 | 2020-03-01 | 获取一个矩阵的转置矩阵 | https://leetcode-cn.com/problems/transpose-matrix/solution/867zhuan-zhi-ju-zhen-by-xiaogd-20m4/ |
面试题 17.10 | 主要元素 | 简单 | 2020-03-01 | 判断一个数组中是否有超过半数的重复元素 | https://leetcode-cn.com/problems/find-majority-element-lcci/solution/mian-shi-ti-1710-zhu-yao-yuan-su-by-xiao-43xy/ |
每日一题
题目编号 | 题目名称 | 难度等级 | 做题日期 | 应用 | 解题思路 |
---|---|---|---|---|---|
28 | 实现 strStr() | 简单 | 2020-04-20 | 判断一个字符串中是否包含另一个子字符串 | String类的indexOf()方法:return haystack.indexOf(needle); |
897 | 递增顺序搜索树 | 简单 | 2020-04-25 | 二叉树搜索树转集合,有序集合构造链表 | 先将二叉树搜索树转为递增的集合,再由集合构造一个递增的链表 |
1011 | 在 D 天内送达包裹的能力 | 中等 | 2020-04-26 | 二分查找的理解应用,二分查找边界的确定 | 确定二分查找的左右边界后,取中位数,按中位数为最大载货量计算天数,如果计算天数小于给定天数,右边界左移;如果计算天数大于给定天数,左边界右移. |
938 | 二叉搜索树的范围和 | 简单 | 2020-04-27 | 二叉搜索树特性的应用,递归练习 | 假设有一个指针指向当前节点,如果节点的值大于上限值,则指针左移;反之节点的值小于下限值,则指针右移。当节点值位于下限值和上限值之间的时候,当前值向左累加大于下限的值,向右累加小于上限的值,所得数值即为结果. |
633 | 平方数之和 | 中等 | 2020-04-28 | Math类的sqrt方法应用,双指针理解 | 解法1:暴力循环,初始化变量a为0,c - a乘a之后开平方,如果所得数字为整数,返回true. 循环结束后没有返回true则返回false;解法2:双指针,取a为0,b为c的开平方取整,当a小于b时,计算a乘a加b乘b的和sum,如果sum等于c,返回true;如果sum小于c,a自增;如果sum大于c,b自减。最终sum没有等于c则返回false。力扣大佬关于这种做法不会错过正确答案的解释:https://leetcode-cn.com/problems/sum-of-square-numbers/solution/shuang-zhi-zhen-de-ben-zhi-er-wei-ju-zhe-ebn3/ |
137 | 只出现一次的数字 II | 中等 | 2020-04-30 | Map的使用-getOrDefault方法 二进制(还没理解) | Map的key值存元素的值,value值存元素出现的次数,取出出现次数为1的值即为该题的解 |
690 | 员工的重要性 | 简单 | 2020-05-01 | 对树这种数据结构以及深度优先遍历的理解,再次理解递归 | 首先将员工按照<id, Employee>的结构存到map中,接着根据拿到目标输入员工,获得其重要性total,遍历该员工下级员工id,根据id拿到员工对象,total累加员工的重要性(此处进行递归调用) |
554 | 砖墙 | 中等 | 2020-05-02 | 用空间换时间 | 通过统计宽度累加值相同的砖块的个数出现的次数统计未经过砖块的数量,用固定值总数量减未经过砖块的最大值,即得经过砖块的最小值 |
7 | 整数反转 | 简单 | 2020-05-03 | 除法和取余操作结合反转整数 | 原数取余的余数为所求数的首位数,所求数乘以10加原数余数,之后原数除以10取下一位数 |
740 | 删除并获得点数 | 中等 | 2020-05-05 | 动态规划 | 使用198.打家劫舍的解题思路降低时间复杂度—删除一个元素,与其相同的元素的点数及其自身点数会加到结果中,再用打家劫舍的思想删除其相邻元素. |
1720 | 解码异或后的数组 | 简单 | 2020-05-06 | 异或运算 | 主要在于理解arr[i] ⊕ arr[i + 1] = encode[i],则arr[i + 1] = arr[i] ⊕ encode[i] |
1486 | 数组异或操作 | 简单 | 2020-05-07 | 异或运算 | ![]() |
1482 | 制作 m 束花所需的最少天数 | 中等 | 2020-05-09 | 二分查找 | 如果bloomDay数组的长度小于要制作花束的数量m和制作每束花需要的花的支数k的乘积,那么即使花全部成熟也不能制出m束花,返回-1; 当bloomDay.length >= m * k时,一定能制作出满足数量的花束,接下来就需要确定时间; 最长的时间就是数组中最大的元素high,最短的时间就是数组中最小的元素low,这是二分查找的边界; 当low < high时,确定中间值制作花束需要的天数days = (high - low)/2 + low; 之后使用canMake方法判断days天内是否能制作出满足数量的花束, canMake方法的思路为bouquets对应制作几束花,flowers为每束花的数量,二者同m和k进行比较。for循环中比较days和bloomDay[i],如果days >= bloomDay[i],证明bloomDay[i]可以在days内开放,那么flowers++。在这个前提下,flowers的数量等于k时,就可以制作一束花,那么重置flowers,bouquets++,如果这个前提不成立,说明bloomDay[i]在days天内还没有开放,重置flowers,进行下一次循环。最后如果bouquets >= m,说明可以制作m束花,返回true,否则返回false; canMake方法返回true时,说明days比较大,还可以在更短的时间内制作m束花,那么降低二分查找的上边界,high = days;反之说明days比较小,需要提高二分查找的下边界low = days + 1。 |
872 | 叶子相似的树 | 简单 | 2020-05-10 | 二叉树深度优先遍历,ArrayList的equals方法的使用 | 使用深度优先遍历分别取两棵树的叶子节点放入两个List集合中,再使用equals方法对两个集合进行比较即可。 |
11734 | 解码异或后的排列 | 中等 | 2020-05-11 | 异或运算 | 在于如何找出原数组的第一个元素,正整数排列是从1开始,设原数组的长度为n,则原数组所有元素异或的结果是1~n异或的结果total,原数组中除了第一个元素以外所有元素异或的结果是encoded所有奇数下表的元素的结果odd(这个自己写一个数组验证即可)。由此可得原数组第一个元素perm[0] = total ^ odd;第一个元素出来后,解法同1720、解码异或后的数组相同 |
1310 | 子数组异或查询 | 中等 | 2020-05-12 | 异或性质的应用 | 1、通过原数组arr计算xors,使xors[i + 1] = arr[i] ^ arr[i + 1]; 2、推导arr[left] ^ arr[left + 1] ^…arr[right] = xors[left] ^ xors[rigth + 1],这里用到相同的数异或为0、异或的结合律两个性质; 3、最后将求arr多个元素的异或转化成求xors两个元素的异或即可。 |
1269 | 停在原地的方案数 | 困难 | 2020-05-13 | 动态规划 | 1、定义dp[i][j]为i步后在下表j的方案数,则有一直不动的dp[0][0] = 1 2、i和j的取值范围分别是i <= steps,j <= arrLen,则有0 <= j <= min(steps, arrLen) 3、由于可以向左向右移动或不动,所以dp[i][j] = dp[i - 1][j - 1] + dp[j - 1][j] + dp[j - 1][j + 1] 4、移动的时候要注意两个条件:i为0时不能向左移动,i为arrLen - 1 时不能向右移动 4、最后答案即为dp[steps][0] |
12 | 整数转罗马数字 | 中等 | 2020-05-14 | 数组转换 | 将罗马数字和阿拉伯数字的每一种表示对应为values数组和symbols数组,之后将num同阿拉伯数字数组的最大值values[i]比较,若num > values[i],则 num -= values[i],将symbols[i]拼接到罗马数组字符串roman上,若num依旧大于values[i],继续上一步,否则取values[i - 1]重复操作,当num = 0时即为转换后的罗马数字. |
13 | 罗马数字转整数 | 简单 | 2020-05-15 | 哈希表的使用 | 将罗马数字和阿拉伯数字对应到哈希表中,对于4,9,40等特殊数字,判断其与后一位的大小,若小于后一位,将其转为复数即可。 |
993 | 二叉树的堂兄弟节点 | 简单 | 2020-05-17 | 二叉树的遍历,递归的使用 | 1、两兄弟相同深度;2、两兄弟父节点不同。 遍历二叉树,寻找左边等于x,右边等于y的值,同时记录遍历的深度以及遍历节点的父节点,当左边的值等于x,右边的值等于y时返回,并判断两边的深度是否相同,两边节点的父节点是否不同,从而得解。 |
1442 | 形成两个异或相等数组的三元组数目 | 中等 | 2020-05-18 | 异或运算中前缀和的应用 | 主要在于如何推导出a^b = s[i] ^ s[j + 1]; |
1738 | 找出第 K 大的异或坐标值 | 中等 | 2020-05-19 | 通过前缀和求martix[i][j]的值,将其由二维矩阵转为一维集合,排序后可以得出第k大的值 | 二维矩阵前缀和的推导,pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ martix[i][j] |
692 | 前K个高频单词 | 中等 | 2020-05-20 | 哈希表、集合排序、优先队列 | 1、哈希表统计次数之后排序放到List集合中,取集合前k个元素组成新集合返回;2、第一步相同,哈希表统计次数;优先队列使用Comparator比较器对象作为构造函数参数创建优先队列对象,之后按照升序从队尾插入数据,然后遍历哈希表,从队列尾部插入数据,当数据的个数大于k时,从队列首部删除数据,最后队列中保留的是前k个出现次数最多的元素;将队列中元素的key值放入集合,不过此时元素的顺序是升序,要将集合反转之后再返回 |
342 | 4的幂 | 简单 | 2020-05-31 | 位运算—与 | 目标数须大于0,且二进制表示第一位不能为1(n&(n - 1) == 0),且与0xaaaaaaaa按位与之后等于0 |
1744 | 你能在你最喜欢的那天吃到你最喜欢的糖果吗? | 中等 | 2020-06-01 | 数组前缀和,数组交集 | 在第favoriteType天能吃到的最少的糖和最多的糖构成一个区间,以favoriteType - 1为下标的前缀和 + 1和以favoriteType为下标的前缀和构成一个区间,两个区间若有交集,返回true,否则返回false |
523 | 连续的子数组和 | 中等 | 2020-06-02 | 数组前缀和 | 从0开始求数组前缀和存入哈希表中,第0个元素没有前缀,存(0, -1),判断两个前缀和之间的子数组能否整除k,只需判断两个前缀和对k取余的结果是否相等即可 |
525 | 连续数组 | 中等 | 2020-06-03 | 数组前缀和 | 遍历数组,将数组前缀和及下标存入哈希表中,每次遍历时判断哈希表中是否包含此次便利的前缀和,如果包含,取此次遍历的下标减掉相同前缀和的下标为最大长度,否则将此次遍历的前缀和以及此次遍历的下标存入哈希表中,遍历结束后即可取得最大长度 |
518 | 零钱兑换 II | 中等 | 2020-06-010 | 动态规划 | 1、int[] dp = new int[amount + 1];定义dp数组,下标表示凑出来的金额数,存放的元素为凑出此金额数的方案数 2、两层循环,第一层取的是硬币数组coins中的每个元素,不同面值的硬币coin,第二层循环,从coin开始计数,开始的下标即为coin,这样做dp[i] = dp[coin] = dp[coin] + dp[coin - coin] = dp[coin] + dp[0] = dp[coin] + 1,1保证了当i恰好为coin时,取一枚coin凑出i的做法,继续循环,当i增加时,i - coin为取一枚大小为coin的硬币后,剩余的金额数由coin大小的硬币凑出来的可能性 3、当第一层循环结束后,所有coin凑出i的可能性计算完毕,dp[amount]即为答案 |
852 | 山脉数组的峰顶索引 | 简单 | 2020-06-015 | 二分查找 | 1、因为是山脉数组,所以第一个元素和最后一个元素不可能是所求下标,取left = 1, right = n - 2, ans取默认值0; 2、进行二分查找,当left <= rigth时,取中位数mid,判断arr[mid]是否大于arr[mid + 1],如果arr[mid]大于arr[mid + 1],说明mid偏大,i向左移,取right = mid - 1;反之向右移,取left = mid + 1; 3、当循环结束,left = right,此时ans的值即为所求的值. |
401 | 二进制手表 | 简单 | 2020-06-21 | 枚举,Integer.bitCount()计算二进制数字中1的个数 | 小时和分钟数两层for循环计算其中二进制中1的位数和同turnedOn相等即符合要求 |
抄完题解不会的题
题目编号 | 题目名称 | 难度等级 | 做题日期 | 应用 | 解题思路 |
---|---|---|---|---|---|
363. | 矩形区域不超过 K 的最大数值和 | 困难 | 2020-04-22 | ||
403 | 青蛙过河 | 困难 | 2020-04-29 | ||
1473 | 粉刷房子 III | 困难 | 2020-05-04 | ||
1723 | 完成所有工作的最短时间 | 困难 | 2020-05-08 | 拆分某个数组为相近的几份 | 数组反转的方法,理解二分查找(边界及中位数的确定) |
421 | 数组中两个数的最大异或值 | 中等 | 2020-05-16 | ||
1049 | 最后一块石头的重量 II | 中等 | 2020-06-08 | ||
879 | 盈利计划 | 困难 | 2020-06-09 | ||
877 | 石子游戏 | 中等 | 2020-06-16 | ||
65 | 有效数字 | 困难 | 2020-06-17 |