LeetCode刷题日记
每日一题啦,我特么真会给自己挖坑。
铁剑库丹
这个作者很懒,什么都没留下…
展开
-
2021年11月12日-猜数字大小 II
375. 猜数字大小 II 首先,拿到题目先自己写几个例子试一试。比如需要求猜 1 - 5 之间的最小金额,怎么算? 其实可以这么想,我先随便才一个数,比如说 2 吧! 那么这时其实就变成了两道规模更小的问题,即求猜出 1 - 1 之间数字的最小金额和猜出 3 - 5 之间数字的最小金额 是不是就变成了一个递归问题了 class Solution { public int getMoneyAmount(int n) { // 备忘录,做剪枝用 int[][] mem原创 2021-11-12 15:33:41 · 255 阅读 · 0 评论 -
2021年11月11日-K个逆序对数组
629. K个逆序对数组 使用动态规划求解,dp[i][j] 表示包含 1 - i 的数字的序列并且刚好拥有 j 个逆序对的个数 所以就有递推公式 dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] + … + dp[i - 1][k] 在 dp[i - 1][k] 的情况下,加上数字 i,所能构成的逆序对最多为 k + i - 1 个,所以 k + i - 1 >= j 那么 k = Math.max(j + 1 - i, 0) class S原创 2021-11-11 11:23:04 · 224 阅读 · 0 评论 -
2021年11月3日-接雨水 II
接雨水 II 首先将最外层当作边界 从最低的边界入手,看它与之相邻的方格是否能盛水 如果能盛水,哪这个方格最终盛水的高度必然已经确定了 将方格盛水后的高度当成新的边界 重复 2 - 5 直至全部的方格都成为边界 class Solution { public int trapRainWater(int[][] heightMap) { int n = heightMap.length; int m = heightMap[0].length; in原创 2021-11-03 10:30:29 · 69 阅读 · 0 评论 -
2021年10月30日-只出现一次的数字 III
001. 只出现一次的数字 III 解法一:哈希表 class Solution { public int[] singleNumber(int[] nums) { HashMap<Integer, Integer> map = new HashMap<>(); int[] result = new int[2]; for (int i = 0; i < nums.length; i++) { In原创 2021-10-30 10:47:50 · 97 阅读 · 0 评论 -
2021年10月27日-删除无效的括号
301. 删除无效的括号 回溯 + 剪枝,懂的都懂。我觉得这种困难提没必要做,纯粹浪费我的时间(‾◡◝) public class InvalidParentheses { public static void main(String[] args) { String s = "(a)())()"; InvalidParentheses self = new InvalidParentheses(); System.out.println(self.r原创 2021-10-27 11:25:30 · 79 阅读 · 0 评论 -
2021年9月29日-为运算表达式设计优先级
为运算表达式设计优先级 题目要求的是运算的不同顺序,所以即使两个运算顺序相同也是不同去重的。我们考虑两种运算顺序只要最后一个运算的运算符是不同位置的,那么就可以保证这两种运算顺序绝对不同,对吧!所以我们可以首先确定最后一个运算符,这样字符串就被分成了两部分,即子问题。我们对子问题递归求解就可以得到所有可能的运算结果。我们根据子问题的运算结果整合一下就是最终答案啦! public class DiffWaysToCompute { public static void main(String[] ar原创 2021-09-29 11:01:41 · 64 阅读 · 0 评论 -
2021年9月28日-路径总和 III
路径总和 III 方法一:直接递归 首先我们用递归解决从根节点出发的路径和为 target 的路径数, 然后我们在遍历每一个节点,每个节点都做一遍上述的递归,将答案累加即使最终答案 中等题的递归一次不行我们就多拆几次? 不过直接递归会做大量重复计算 private int sum = 0; public int pathSum(TreeNode root, int targetSum) { if (root == null) { return 0; } sum +=原创 2021-09-28 14:17:17 · 49 阅读 · 0 评论 -
2021年9月27日-最大正方形
005. 最大正方形 dp[i][j]dp[i][j]dp[i][j] 表示以 matrix[i][j]matrix[i][j]matrix[i][j] 为右下角的最大矩形的边长 public class MaximalSquare { public static void main(String[] args) { char[][] matrix = { {'1', '0', '1', '0', '0'}, {'1', '0原创 2021-09-27 13:20:33 · 61 阅读 · 0 评论 -
2021年9月27日-最长递增子序列
最长递增子序列 方法一:dp[i] 表示以 nums[i] 结尾的递增子序列的最大长度,复杂略高 // 时间复杂度高 public int lengthOfLIS(int[] nums) { // dp[i] 以 nums[i] 为结尾的严格递增子序列 int[] dp = new int[nums.length]; dp[0] = 1; int max = 1; for (int i = 1; i < dp.length; i++) { for原创 2021-09-27 13:00:27 · 47 阅读 · 0 评论 -
2021年9月23日-3的幂
3的幂 进阶:不能使用循环或递归 考虑到凡是 3 的幂都是 3 * 3 * 3 * … 3 的形式,所以凡是 3 的幂的数,它的因数都是 3 的幂。如果一个数,不能整除比它的 3 的幂,那么这个数不是 3 的幂 所以数学解法就是: class Solution { public boolean isPowerOfThree(int n) { return n > 0 && 1162261467 % n == 0; } } 像这种数学解法做个积累就行原创 2021-09-23 10:35:02 · 174 阅读 · 0 评论 -
2021年9月18日-回文子串数
回文子串数 中心扩展法: 选定回文串的中心,用两个指针分别向两边移动,在移动的过程中检查 s.subString(i, j) 还是不是回文串,即 s[i] == s[j] 吗?是的话结果加一,不是的话停止移动换下一个中心 不过回文串的长度有奇数和偶数,所以中心要分别枚举一个和两个的情况 // 中心扩展法 public int countSubstrings(String s) { int res = 0; for (int i = 0; i < s.length(); i++) {原创 2021-09-18 11:35:08 · 58 阅读 · 0 评论 -
2021年9月12日-比特位计数
#比特位计数 Brian Kernighan 算法: x&(x−1)x \& (x - 1)x&(x−1) 能将xxx的二进制表示的最后一个111变成000 所以就有递推公式:dp[i]=dp[i&(i−1)]+1dp[i] = dp[i \& (i - 1)] + 1dp[i]=dp[i&(i−1)]+1 class Solution { public int[] countBits(int n) { int[] bits = n原创 2021-09-13 11:39:37 · 34 阅读 · 0 评论 -
2021年9月13日-最长回文字串
最长回文子串 回文串去掉首尾依旧是一个回文串(特别考虑长度为 1 和 2 的情况) 字符串的动态规划,dp[i][j]的含义一般是字符串的字串 i 到 j public String longestPalindrome(String s) { // 回文串去掉首位依旧是一个回文串(长度小于 3 时比较特殊) int start = 0, end = 0; // dp[i][j] 表示 s 从索引 i 到 j 是否是回文串 boolean[][] dp = new bool原创 2021-09-13 11:38:48 · 41 阅读 · 0 评论 -
2021年5月21日-不相交的线
一、题目描述 链接直达1035. 不相交的线 二、思路分析 题目要求: 两数组对应相等的两个点可以连成线 所有连成的线不能相交 就是说从两个数组中取出相等点对,而且点对的相对顺序是不变的。即求最大公共子序列。 利用动态规划,设dp[i][j]表示当数组分别长为i和j时最大公共子序列的长度。 边界情况:当i和j任意一方为零时,即序列长度为零,自然公共子序列也为零。 状态转移方程:当nums1[i]=nums2[j]时,自然dp[i][j] = dp[i - 1][j - 1] + 1,关键不等时,dp[原创 2021-05-21 19:49:12 · 69 阅读 · 0 评论 -
2021年4月23日-最大整除子集
一、题目描述 链接直达:368. 最大整除子集 二、思路分析 最大整除子集意味着: 集合中任意两个数满足:a % b == 0 || b % a == 0 集合元素个数是最多的 题目要求一个最大子集的list集合,不唯一。这并不能很方便的直接求出来,可以先求最大子集的长度。 怎样求最大子集的长度呢? 将数组按升序排序 创建dp[]数组,dp[i] 意思是:nums[i]是某一整除子集的最大元素是,最大整除子集的长度是dp[i]; dp[0] 毫无疑问就是1,那dp[i]是多少呢?我们可以遍历dp[0]原创 2021-04-24 00:19:23 · 140 阅读 · 0 评论