力扣
力扣
fFee-ops
it's tough.
展开
-
1734. 解码异或后的排列
经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1]。首先题目说的perm它是前 n 个正整数的排列,且是奇数,那么我们求它的所有值的异或,就遍历1到N进行异或就行。相差的就是不知道perm中的第一个数字,那我们只需要求出perm中的第一个数,剩下的就好办了。首先看循环截止,它是遍历了encode的所有值,而且i是从1开始的。的思路,其实就是知道perm中的两个数,就能异或出encode中对应的数。原创 2024-09-19 20:22:47 · 583 阅读 · 0 评论 -
1035. 不相交的线
因为DP的含义是前N个数,所以前0个数相当于没有啥用,所以要获取到最后题目要求的结果那就是要。还是根据DP数组的含义,需要到达m和n,所以for循环需要能够等于数组长度。题目一看是求最值,那就可以考虑用DP来做。NOTE] 1、DP数组的大小。NOTE] 2、for循环边界。,所以初始化大小要初始化为。原创 2024-09-18 11:46:21 · 289 阅读 · 0 评论 -
321. 拼接最大数
2、从两个数组组成对应的子序列,使用单调栈思想(遍历数组,如果当前数字比已选择的最后一个数字大,并且还可以替换元素,则删除已选的元素并选取当前更大的元素。选取两个元素,选取出来后必须保持顺序,比如选4和2,那么组成新数组这两个元素的顺序必须还是4在2前面),元素总长度不超过K,组成一个最大的数组。它的核心逻辑就是看当前选择的元素是不是比现在的元素小,如果比现在的元素小而且还有可替换的元素,那么用当前元素替换已选择元素。个元素后,尚未选中的元素数量,它们可以被用来替换当前已选中的元素,达到优化结果的目的。原创 2024-09-15 21:49:24 · 886 阅读 · 0 评论 -
952. 按公因数计算最大组件大小
见。原创 2024-09-12 10:48:47 · 277 阅读 · 0 评论 -
PTA.7-6 数字拆分求和
这题目有两种思路:1. 利用等差数列公式 2. 暴力法公式记不住,所以讲下暴力法(PTA对时间空间复杂度要求很低,LeetCode行不通的,还是要背公式)暴力法很简单,就是穷举所有可能性。具体步骤是:首先假设序列的首项为 a1,然后依次构造出符合条件的序列。对每个序列,依次加上差值 1、2、3、…,直到总和等于 k 或超出 k。如果找到符合条件的序列,打印出来。原创 2024-09-06 11:05:16 · 187 阅读 · 0 评论 -
PTA.7-1 按格式合并两个链表
题目一看是和链表相关的,而且是两个链表,那肯定核心思路和双指针相关了。原创 2024-09-04 21:33:38 · 324 阅读 · 0 评论 -
125. 验证回文串
见。原创 2024-09-04 12:00:08 · 237 阅读 · 0 评论 -
1306. 跳跃游戏 III
见。原创 2024-09-03 18:26:14 · 295 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数
见。原创 2023-10-26 22:30:24 · 799 阅读 · 0 评论 -
二叉树直径、最大路径和等总结
二叉树直径、最大路径和总结534、二叉树的直径124、二叉树中的最大路径和687、最长同值路径今天发现这三题的解法十分类似,于是放到一起。534、二叉树的直径/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */原创 2021-04-28 10:50:04 · 237 阅读 · 0 评论 -
647. 回文子串(高频题)
647. 回文子串解题思路代码解题思路本题和lc第5题思路差不多,而且注意,一般寻找回文串 都是用从中心向两端扩大代码class Solution { public int countSubstrings(String s) { int res=0; for (int i = 0; i < s.length(); i++) { //寻找长度为奇数的回文子串 res = res + palindrome(s,原创 2021-03-21 17:37:31 · 226 阅读 · 0 评论 -
621. 任务调度器(高频题)
621. 任务调度器解题思路代码解题思路这题大致用贪心思想,但是我觉得这是一个找规律的题目。一刷2021/3/21,没弄明白代码class Solution {/** * 解题思路: * 1、将任务按类型分组,正好A-Z用一个int[26]保存任务类型个数 * 2、对数组进行排序,优先排列个数(count)最大的任务, * 如题得到的时间至少为 retCount =(count-1)* (n+1) + 1 ==> A->X->X->A->X->原创 2021-03-21 17:33:20 · 181 阅读 · 0 评论 -
581. 最短无序连续子数组(高频题)
581. 最短无序连续子数组解题思路代码解题思路数组问题一般就想到双指针。将数组 nums 进行排序,记为 numsSort,然后比较 nums 和 numsSort 的元素来决定最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。首先,从左向右遍历两个数组,找到第一次两个数组中元素不同的位置,即为最左边的不同的位置也就是最短无序连续子数组的左边界。然后,从右向左遍历两个数组,找到第一次两个数组中元素不同的位置,即为最右边的不同的位置也就是最短无序连续子数组的右边界。实例原创 2021-03-21 16:28:16 · 184 阅读 · 0 评论 -
494. 目标和(高频题)
494. 目标和解题思路代码解题思路这题其实可以转化成动态规划中的零一背包问题,所以这个背包容量就是 (target + sum(nums)) / 2,要装入背包的东西就是nums[]中的元素。这其中dp[i]的含义还是背包问题通用的套路:dp[i][j] = x表示,若只在前 i 个物品中选择,若当前背包的容量为 j,则最多有 x 种方法可以恰好装满背包。注意这个base case可能有点难理解:如果数组和sum小于目标和S,则不存在正确解,这一点很好理解,所有的数都是正还小于S的话,怎原创 2021-03-21 13:20:04 · 126 阅读 · 0 评论 -
461. 汉明距离(高频题)
461. 汉明距离解题思路代码解题思路每次比较最右边的那个二进制位是否相同,然后不断右移即可代码class Solution { public int hammingDistance(int x, int y) { int res=0; while(x!=0||y!=0){ int a=x&1; int b=y&1; if(a!=b){ re原创 2021-03-20 11:05:38 · 206 阅读 · 0 评论 -
448. 找到所有数组中消失的数字(高频题)
448. 找到所有数组中消失的数字解题思路代码解题思路将所有正数作为数组下标,置对应数组值为负值。那么,仍为正数的位置即为(未出现过)消失的数字。举个例子:原始数组:[4,3,2,7,8,2,3,1]重置后为:[-4,-3,-2,-7,8,2,-3,-1]结论:[8,2] 分别对应的index+1后为[5,6](消失的数字)代码class Solution { public List<Integer> findDisappearedNumbers(int[]原创 2021-03-20 10:55:16 · 126 阅读 · 0 评论 -
399. 除法求值(高频题)
399. 除法求值解题思路代码解题思路一刷2021/3/20,没弄明白,题解见这里代码// 定义邻接节点类class Node { // 邻接节点代表的字符串 public String id; // 到达邻接节点所需的倍数 public double num; public Node(String i, double n) { id = i; num = n; }}class Solution { //原创 2021-03-20 10:39:31 · 163 阅读 · 0 评论 -
394. 字符串解码(高频题)
394. 字符串解码解题思路代码解题思路这题主要用到了栈,本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。算法流程1、构建辅助栈 stack, 遍历字符串 s 中每个字符 c;当 c 为数字时,将数字字符转化为数字 multi,用于后续倍数计算;当 c 为字母时,在 res 尾部添加 c;当 c 为 [ 时,将当前 multi 和 res 入栈,并分别置空置 0:记录此 [ 前的临时结果 res 至栈,用于发现对应 ] 后的拼接操作;记录此 [ 前的原创 2021-03-20 10:26:46 · 198 阅读 · 0 评论 -
338. 比特位计数(高频题)
338. 比特位计数解题思路代码解题思路其实这就是一个数学题,找到规律了就很简单一个数比如a,如果是偶数,那么a比特位1的个数和(a/2)比特位1的个数是一样的,因为一个数是偶数那么他的二进制比他的一半的二进制只是多了一个0而已。如果是奇数就不一样了,他会比除以2的结果多了一个1(比如9的二进制比4的二进制多一个1,19的二进制比9的二进制多一个1,等等)。代码public class Solution { public int[] countBits(int num)原创 2021-03-19 23:19:24 · 102 阅读 · 0 评论 -
322. 零钱兑换(高频题)
322. 零钱兑换解题思路代码解题思路这题典型的动态规划套路下的 完全背包问题,主要注意需要求的是最小值,那我们就需要先给dp数组全都赋一个最大值,一般常取Integer.MAX_VALUE,这个题目中,因为amount的值我们已经知道所有可以取一个值amount+1,这样和Integer.MAX_VALUE的效果是一样的,相当于取了一个"天花板"值.不可能超过这个值然后就是套背包模板了代码class Solution { public int coinChange(int[] co原创 2021-03-19 22:54:57 · 121 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期(高频题)
309. 最佳买卖股票时机含冷冻期解题思路代码解题思路买卖股票问题都可以用动态规划,具体思路见这里代码public class Solution { public int maxProfit(int[] prices) { int len = prices.length; if (len < 2) { return 0; } int[][] dp = new int[len][3];原创 2021-03-19 22:09:59 · 116 阅读 · 0 评论 -
301. 删除无效的括号(高频题)
301. 删除无效的括号解题思路代码解题思路要用回溯算法,一刷2021/3/19,没有完全弄明白代码class Solution { // 用集合存储所有正确的字符串,可避免重复 private Set<String> set = new HashSet<>(); public List<String> removeInvalidParentheses(String s) { char[] ss = s.toCharArr原创 2021-03-19 21:57:50 · 104 阅读 · 0 评论 -
283. 移动零(高频题)
283. 移动零解题思路代码解题思路很简单的双指针,每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。代码class Solution { public void moveZeroes(int[] nums) { int n = nums.length, left = 0, right = 0; while (right < n) { if (nums[right] != 0) {原创 2021-03-19 21:15:33 · 113 阅读 · 0 评论 -
221. 最大正方形(高频题)
221. 最大正方形解题思路代码解题思路一看求最大面积,而且感觉后一步和前一步之间还有联系,并且问题规模可以很大,直接动态规划。题解见这里代码class Solution { public int maximalSquare(char[][] matrix) { /** dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为: dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j],原创 2021-03-19 17:06:58 · 207 阅读 · 0 评论 -
207. 课程表(高频题)
207. 课程表解题思路代码解题思路这种有先决顺序的工程安排问题一般就是拓扑排序,这道题是拓扑排序的裸题。详细解题思路见这篇文章代码class Solution { // 节点的入度: 使用数组保存每个节点的入度, public boolean canFinish(int numCourses, int[][] prerequisites) { // 1.课号和对应的入度 Map<Integer, Integer> inDegre原创 2021-03-19 16:57:25 · 131 阅读 · 0 评论 -
152. 乘积最大子数组(高频题)
152. 乘积最大子数组解题思路代码解题思路本题要用动态规划,主要思路如下代码class Solution { public int maxProduct(int[] nums) { int n = nums.length; if (n == 0) { return 0; }// dpMax[i] 表示以第 i 个元素的结尾的子数组,乘积最大的值 int[] dpMax = new int[n];原创 2021-03-19 16:21:16 · 143 阅读 · 0 评论 -
148. 排序链表(高频题)
148. 排序链表解题思路代码解题思路这题想到要排序,是链表。用快慢指针,还需要扩展一下,归并排序。但是要注意,这里的归并排序和 给数组归并排序有一丢丢的不同,因为这个链表不支持随机访问代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { t原创 2021-03-19 15:55:33 · 86 阅读 · 0 评论 -
139. 单词拆分(高频题)
139. 单词拆分解题思路代码解题思路本题用动态规划,dp[i]表示s前i个字符能否拆分转移方程:dp[i] = dp[j] && check(s[j+1, i]);代码class Solution { /* 动态规划算法,dp[i]表示s前i个字符能否拆分 转移方程:dp[j] = dp[i] && check(s[i+1, j]); check(s[i+1, j])就是判断i+1到j这一段字符是否能够拆分原创 2021-03-18 22:47:29 · 305 阅读 · 0 评论 -
128. 最长连续序列(高频题)
128. 最长连续序列解题思路代码解题思路对于数组nums,其可能有多个数字连续的序列,其中每个序列都会有一个左边界,例如示例1的结果中[1, 2, 3, 4]的左边界就为1。如果我们知道了每一个连续序列的左边界,并且知道以它为左边界的连续序列的长度。进而就可以知道所有连续序列的长度。在其中取最大值即为结果。但都有哪些数可以成为连续序列的左边界呢?设想,如果num为一个左边界,那么num - 1就不应该存在于数组中(因为如果num - 1存在于数组中,num - 1又与num连续,所以num不可原创 2021-03-18 18:38:11 · 162 阅读 · 0 评论 -
124. 二叉树中的最大路径和(高频题)
124. 二叉树中的最大路径和解题思路代码解题思路见这篇题解代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int res = Integer.MIN_VA原创 2021-03-18 18:24:32 · 101 阅读 · 0 评论 -
114. 二叉树展开为链表(高频题)
114. 二叉树展开为链表解题思路代码解题思路用后序遍历,把左子树接到根节点上,再把原来的右子树接到现在的右子树上,然后把原来的左子树置为null。 虽然是后序遍历,但是连接起来成链表,就是前序遍历的结果代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode()原创 2021-03-18 17:33:08 · 165 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树(高频题)
105. 从前序与中序遍历序列构造二叉树解题思路代码解题思路和剑指offer第七题一样代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tree原创 2021-03-18 16:54:11 · 140 阅读 · 0 评论 -
102. 二叉树的层序遍历(高频题)
102. 二叉树的层序遍历解题思路代码解题思路没啥说的,题目都告诉你要用层级遍历了,也就是BFS。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2021-03-18 16:35:08 · 88 阅读 · 0 评论 -
79. 单词搜索(高频题)
79. 单词搜索解题思路代码解题思路做多了这种题目,直接发现是回溯法,一个方向一个方向的去试就行了代码class Solution { public boolean exist(char[][] board, String word) { char[] words = word.toCharArray(); for (int i = 0; i < board.length; i++) { for (int j = 0; j &l原创 2021-03-18 16:25:56 · 220 阅读 · 0 评论 -
98. 验证二叉搜索树(高频题)
98. 验证二叉搜索树解题思路代码解题思路中序遍历时,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。代码class Solution { long pre = Long.MIN_VALUE; public boolean isValidBST(TreeNode root) { if (root == null) { return true; } // 访原创 2021-03-17 19:18:05 · 112 阅读 · 0 评论 -
84. 柱状图中最大的矩形(高频题)
84. 柱状图中最大的矩形解题思路代码解题思路一刷 2021/3/17,没搞懂题解见这里代码class Solution { public int largestRectangleArea(int[] heights) { // 这里为了代码简便,在柱体数组的头和尾加了两个高度为 0 的柱体。 int[] tmp = new int[heights.length + 2]; System.arraycopy(heights, 0, tmp,原创 2021-03-17 16:53:37 · 88 阅读 · 0 评论 -
64. 最小路径和(高频题)
64. 最小路径和解题思路代码解题思路最基本的动态规划,问题,找准了dp数组的含义就没啥难的了。dp[i][j]:到下标(i,j)的最小和代码class Solution { public int minPathSum(int[][] grid) { if(grid.length==0){ return 0; } //dp[i][j]:到下标(i,j)的最小和 int[][] dp=new int[g原创 2021-03-17 16:19:13 · 90 阅读 · 0 评论 -
62. 不同路径(高频题)
62. 不同路径解题思路代码解题思路求最值问题,而且看得出来比较复杂的情况,直接动态规划。dp[i][j]:到坐标(i,j)共有几条路径那么结果就是dp[m-1][n-1]因为只能向右或者向下移动,所以状态转移方程很容易写出来代码class Solution {public int uniquePaths(int m, int n) { //dp[i][j]:到坐标(i,j)共有几条路径 int[][] dp = new int[m][n];原创 2021-03-17 15:57:24 · 119 阅读 · 0 评论 -
56. 合并区间(高频题)
56. 合并区间解题思路代码解题思路是否有重叠区间的问题,直接贪心思路,根据数组的end或者start进行升序排序,再看看start和end的大小关系来判断是否重叠。像435题就是一样的类型。不过本题要注意,一定要根据start的升序排列,不能根据end来排列,不然就会出现下图所示的情况:代码class Solution { public int[][] merge(int[][] intervals) { List<int[]> arr = new Arra原创 2021-03-17 15:42:18 · 86 阅读 · 0 评论 -
49. 字母异位词分组(高频题)
49. 字母异位词分组解题思路代码解题思路本题没有啥通用的套路,只能直接去想咋做了。因为异位词排序后是一样的,所以只需要维护一个map,key为排序后的字符串,val为一个list集合,其中包含着原本的字符串。具体分析如下代码class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String, List<String>> m原创 2021-03-17 15:05:15 · 99 阅读 · 0 评论