力扣每日一题
力扣每日一题,尽力坚持
菜-卷
欲买桂花同载酒,终不似,少年游......
展开
-
day-55 不同路径
动态规划:因为只能向右或向下移动,可以得出状态转换方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]直接令第一行和第一列全为1,然后通过状态转换方程进行计算,返回dp[m-1][n-1]即可。原创 2024-09-14 19:08:00 · 167 阅读 · 0 评论 -
day-55 从字符串中移除星号
2.当前字符不为时:2.1如果num>0,直接跳过当前字符;2.2如果num==0,将当前字符头插入需要返回的字符串。因为删掉及其左边第一个字符,所以从右向左遍历,维护一个num的值,num表示还需要删掉多少个的左边第一个字符。1.当前字符为时:num++;原创 2024-09-14 09:38:16 · 300 阅读 · 0 评论 -
day-53 两个线段获得的最多奖品
dp[right] 表示右端点不超过 prizePositions[right] 的线段可以覆盖最大奖品数量,然后枚举后面一条线段的右端点(第一条线段在第二条线段左边),第二条线段的长度可以表示为right-left+1;第一条线段的长度可以表示dp[left]通过枚举dp[left]+right-left+1的值,最大的那个即为答案。原创 2024-09-11 20:34:14 · 347 阅读 · 0 评论 -
day-54 求出最多标记下标
指针right从第二部分从右向左开始遍历,指针left从第一部分从右向左开始遍历,如果满足nums[left]*2原创 2024-09-12 19:00:40 · 230 阅读 · 0 评论 -
day-49 让所有学生保持开心的分组方法数
利用Collections.sort()函数对数组进行排序,依次向后遍历即可,如果nums.get(i)i+1。注意特殊情况:全选和不选要单独讨论。原创 2024-09-04 20:26:35 · 310 阅读 · 0 评论 -
day-48 分割回文串
利用dfs算法,用ids表示当前所指向字符的位置,依次判断s.charAt(ids),s.charAt(ids)+s.charAt(ids+1)…是否为回文字符串,如果是则加入链表p,再递归调用dfs函数。每次调用dfs函数后记得还原现场。原创 2024-09-03 19:47:03 · 277 阅读 · 0 评论 -
day-52 字母异位词分组
首先将字符串转换为字符数组,再利用Arrays.sort()函数排序后重新转换为字符串存入哈希表中。将所有字符串转换为按字典序列排列的字符串然后存入哈希表中,便可判断是否为字母异位词。原创 2024-09-10 20:55:20 · 264 阅读 · 0 评论 -
day-47 子集
利用深度优先遍历算法,对于每个数有选或不选两种抉择,每次遍历到ids==len时将p加入答案中。选中当前数字,调用dfs函数之后记得还原。原创 2024-09-02 21:00:09 · 185 阅读 · 0 评论 -
day-52 下一个排列
从后向前遍历数组,把遍历过的元素加入一个有序链表,没变里一个元素判断链表中是否有元素大于当前遍历元素,如果有,把链表中大于当前遍历元素的元素集合中最小的那一个元素赋给当前元素,然后将链表中剩余元素依次赋值给当前遍历元素之后的元素。如果输入数组已经是能组成最大的数,则数组升序排列再返回。原创 2024-09-10 21:07:53 · 164 阅读 · 0 评论 -
day-50 求出最长好子序列 I
二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0原创 2024-09-07 10:11:11 · 311 阅读 · 0 评论 -
day-52 三数之和
双指针:确定最小的那个数(i0原创 2024-09-10 20:48:37 · 309 阅读 · 0 评论 -
day-47 组合
回溯:利用个dfs方法递归调用,每个元素有选或不选两种抉择,当选中元素个数等于k时,将链表p加入答案,当ids==n且选中元素个数小于n时,直接返回。每次选中元素调用dfs方法后记得还原。原创 2024-09-02 21:07:12 · 277 阅读 · 0 评论 -
day-49 使数组中所有元素相等的最小操作数
第一个数和最后一个数要变为一致,需要操作n-1次,然后第二个数和倒数第二个数要操作n-3次。以此类推即可得出答案。原创 2024-09-04 20:42:43 · 220 阅读 · 0 评论 -
day-49 行和列中一和零的差值
利用两个矩阵存储每行和每列的零的个数和一的个数。最后对应位置一的个数减去零的个数即可。原创 2024-09-04 20:53:29 · 238 阅读 · 0 评论 -
day-48 一个小组的最大实力值
想把所有非零数相乘,再统计负数的个数,如果负数为奇数个,则把乘机除以最大的那个负数即为答案,如果为偶数个,那么乘机即为答案。但要考虑特殊情况:1.只有零和一个负数,返回零。原创 2024-09-03 19:35:03 · 449 阅读 · 0 评论 -
day-51 合并零之间的节点
直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可。返回链表可以有头结点,方便插入,返回head.next。原创 2024-09-09 10:38:35 · 326 阅读 · 0 评论 -
day-43 有效的数独
暴力解法:1.判断每行是否有重复的数字;2.判断每列是否有重复的数字;3.判断每一个以粗实线分隔的 3x3 宫内是否有重复的数字。如果以上三种情况都不存在重复的数字,则返回true。原创 2024-08-29 21:48:23 · 141 阅读 · 0 评论 -
day-44 所有数对中数位不同之和
例如:13、12的数位不同之和,可以简化为个位2、3和十位1、1的数位不同之和,即答案为1。需要注意(2,3)会被计算两次,所以最终答案需要除以2。因为所有整数都有相同的数位长度,所以先算出数位长度,然后依次统计个位、十位、百位…的数位不同之和,最后除以2。原创 2024-08-30 09:37:11 · 290 阅读 · 0 评论 -
day-47 考试的最大困扰度
滑动窗口:如果用left和right表示连续相同结果的题数的左右边界,那么意味着可以修改k次,我们可以分别统计T和F连续相同的题数的最大值,然后返回Math.max(maxLen(‘T’,k),maxLen(‘F’,k))即可。numk时,将left向右移动,直到不再满足num>k。假设计算连续相同答案为T的题数,用一个变量num记录left和right之间F的个数。原创 2024-09-02 10:12:04 · 202 阅读 · 0 评论 -
day-47 最大连续1的个数 III
用一个变量num记录left和right之间0的个数,当numk时,将left向右移动,直到不再满足num>k。滑动窗口:如果用left和right表示连续1的左右边界,那么意味着可以把0修改为1的次数为k次。原创 2024-09-02 10:23:50 · 304 阅读 · 0 评论 -
day-45 全排列
递归调用dfs,利用一个数组来表示当前位置是否已经被选中,如果没有则选中当前数字,num+1(num表示已经选中数字个数),每当num==nums.length时,将List加入答案。注意:使用num+1作为传参,不要num++(num++是先传参,再++)原创 2024-08-31 21:07:36 · 294 阅读 · 0 评论 -
day-46 旋转图像
关键:旋转过程中互相交换的四个元素的坐标为:1.matrix[i][j] 2. matrix[n - 1 - j][i] 3.matrix[n - 1 - i][n - 1 - j] 4.matrix[j][n - 1 - i]不能使用辅助数组,所以关键在于弄清楚旋转后坐标的变化规律。当矩阵的大小n为偶数时,以n/2行和n/2列的元素为起点,当矩阵的大小n为奇数时,以n/2行和(n+1)/2列的元素为起点。原创 2024-09-01 20:26:38 · 321 阅读 · 0 评论 -
day-43 盛最多水的容器
双指针:首先令i=0,j=height.length-1,选取短板(即Math.min(height[i],height[j])),然后将短板向内移动,直达i>=j即可得到答案。所以只需要维护一个最大值max,通过短板的不断内移,维护max=Math.max(max,Math.min(height[i],height[j])*(j-i))即可。长板向内移动:水的容量不可能增大。短板向内移动:水的容量可能增大。原创 2024-08-29 21:00:48 · 525 阅读 · 0 评论 -
day-43 括号生成
判断是否括号规则:第一个位置只能是(,维护一个val值(初始值为0),遍历字符串,每当加入(时,val–,每当遇到)时,val++。遍历过程中,如果存在val>0,则不满足括号规则。通过深度优先遍历,把所有可能的组合枚举出来,然后依次判断是否符合括号规则,符合则加入链表。原创 2024-08-29 21:16:23 · 116 阅读 · 0 评论 -
day-44 组合总和
回溯的思想:用一个i变量记录当前抉择数字所在位置,对于每一个数字,都有选或不选两种可能,如果选择当前数字,则i不变,并把当前数字加入链表当中,sum也加上当前数字的值;如果不选,则只需将i++。选:p.add(arr[i]);不选:dfs(p,i+1,sum);关键在于选或不选两种抉择怎么用代码表示。target时把当前的p加入答案。原创 2024-08-30 14:23:06 · 168 阅读 · 0 评论 -
day-43 Z 字形变换
第二行位置:1 2*(numRows-1)-1 2*(numRows-1)+1。第一行位置:0 2*(numRows-1) 4*(numRows-1)注意:当numRows为1时,直接返回s。只需要依次按照行进行遍历即可。原创 2024-08-29 20:46:15 · 208 阅读 · 0 评论 -
day-45 全排列 II
可以利用Arrays.sort()函数将nums数组进行排序,这样相同的全排列数字的位置也会相同,可以利用List的contains()函数进行判断,如果不重复则加入答案。与上一题思路相同,代码也基本一致,只是需要全排列不重复。原创 2024-08-31 21:14:40 · 241 阅读 · 0 评论 -
day-37 最大正方形
2.对剩下其他位置进行遍历,若对应位置的matrix为’0’时,dp数组对应位置也为零,若不为’0’,则为dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1。1.首先将第一行和第一列初始化,当对应位置的matrix为’0’时,dp数组对应位置也为零,否则为1。动态规划,这题主要得弄明白状态转换方程,dp[i][j]表示以(i,j)为右下角的最大正方形。3.最后dp数组中最大值的平方即为答案。原创 2024-06-02 22:01:07 · 601 阅读 · 0 评论 -
day-39 矩阵中的最大得分
利用一个二维数组记录对应位置可以达到的最高得分(位置(0,0)不可能),然后找出最大值即可(如果除了(0,0)上的值其他值都一样,则返回任意一个即可)。首先算出第一行和第一列的最大得分,其余位置的最高得分只与左边位置和上边位置的最高得分有关联。原创 2024-08-15 17:56:27 · 364 阅读 · 0 评论 -
day-40 合并区间
intervals[0][1]和intervals[1][0]进行比较,如果intervals[0][1]原创 2024-08-26 22:17:32 · 356 阅读 · 0 评论 -
day-41 零钱兑换
arr初始化值为Integer.MAX_VALUE,再令arr[0]=0,arr[coins[j]]=1(0原创 2024-08-27 20:39:40 · 281 阅读 · 0 评论 -
day-38 交错字符串
转换方程:dp[i][j]=(dp[i-1][j]&&s3.charAt(i+j-1)==s1.charAt(i-1))||(dp[i][j-1]&&s3.charAt(i+j-1)==s2.charAt(j-1))动态规划,利用一个二维数组,dp[i][j]表示s3前i+j个字符能否用s1前i个字符和s2前j个字符交错形成。原创 2024-08-13 17:04:50 · 142 阅读 · 0 评论 -
day-40 员工的重要性
把查询员工的重要度加入返回值,再dfs算法将下属员工的重要度加入返回值(如果下属员工还有下属员工,也利用dfs加入,以此类推)利用一个哈希表,把员工id作为key值,把员工信息(Employee)作为value值,再利用深度优先遍历即可。原创 2024-08-26 10:16:17 · 282 阅读 · 0 评论 -
day-42 分割字符频率相等的最少子字符串
判断是否为平衡字符串,利用哈希表存储存储每种字符出现的次数。为了判断快速判断所有字符出现的次数是否相等,我们可以维护所有字符出现次数的最大值 maxVal,当满足map.size()*maxVal==i-j+1,所有字符出现的次数相等。动态规划的思想,dp[i]表示从s[0]到s[i]这一子串的最少平衡子串数,当s[i]到s[n-1]是平衡字符串时,dp[i]=dp[j-1]+1,所以状态转换方程为dp[i]=Math.min(dp[j-1]+1)(1原创 2024-08-28 20:51:07 · 413 阅读 · 0 评论 -
day-33 收集垃圾的最少总时间
利用一个二维数组(数组行数为3,分别对应三种垃圾)记录垃圾数量,arr[0][i]表示第i个房子的金属、纸和或玻璃垃圾。将三种垃圾数量(值与时间相同)相加,最后对应垃圾车最远需要走到哪个房间,加上对应的花费时间数。原创 2024-05-11 16:55:14 · 231 阅读 · 0 评论 -
day-37 电话号码的字母组合
设置一个char型的二维数组,每次从号码对应的子母中选出一个,拼接在一起即可。注意:有的数字对应三个字母,有的对应四个字母。原创 2024-06-02 14:19:49 · 234 阅读 · 0 评论 -
day-34 二叉树的锯齿形层序遍历
相较于二叉树的层序遍历,多了一个flag变量,当flag等于0时,把当前层的数组从左到右放入链表,当flag等于1时,把当前层的数组从右到左放入链表。注意:链表删除一个数据后会立即重排,所以删除同一层的节点时,每次都删除第一个节点。原创 2024-05-12 21:54:39 · 228 阅读 · 0 评论 -
day-35 二叉树的右视图
注意:链表删除一个数据后会立即重排,所以删除同一层的节点时,每次都删除第一个节点。根据层序遍历的思路。将每一层的最右边元素加入返回序列即可。原创 2024-05-13 09:41:24 · 218 阅读 · 0 评论 -
day-36 删除链表的倒数第 N 个结点
首先计算出链表的长度,然后删除第n个节点即可,但要注意考虑特殊情况。特殊情况:1.删除节点为最后一个节点。2.删除节点为头结点。原创 2024-06-01 16:06:00 · 255 阅读 · 0 评论 -
day-35 被围绕的区域
检测边界上的字符,如果是O则向周围探测,访问与之连接的不会被覆盖的X。边界探测结束后,没有访问过的O皆会被X覆盖。很明显,只有与边界上的O连接的O才不会X覆盖。原创 2024-05-13 10:35:46 · 218 阅读 · 0 评论