LeetCod刷题笔记
目录
2739.总行驶距离
思路:模拟
模拟即可:
每次循环主油箱减去5升
(1)主箱是有5升油,并且副油箱有油则,主油箱加一,副油箱减一。
(2) 主油箱有5升油,副油箱无油,继续下次循环
(3)主油箱没有5升油,返回,答案加上剩余的主箱油即可
代码
如果你的代码真是无敌了!那么这件事真的是泰裤辣!!!!!
6890.找出分区值
思路:急转弯
(1)sort排序从小到大
(2)取两两相邻的最小值即可
代码:
这件事真的是泰裤辣!!
1254.统计封闭岛屿的数目
思路:DFS
(1)从网格图的第一行、最后一行、第一列和最后一列的所有 0 出发,DFS 访问四方向的 0,并把这些 0 标记成「访问过」。代码实现时可以直接把 0 修改成 1。
(2)然后从剩下的 0 出发,按照同样的方式 DFS 访问四方向的 0,同时把 0 改成 1。每次从一个新的 0 出发(起点),就意味着找到了一个新的封闭岛屿,答案加一。
(3)此外,如果行数或列数不足 3,此时没有封闭岛屿,可以直接返回 0。
代码:
6447.给墙壁刷油漆
思路:动态规划
dp[i][j]表示墙[0,i]中粉刷至少j面的最小花费,答案应该为dp[n-1][n]。
状态转移
按照01背包的套路,最外层循环是枚举0 <= i < n。内层循环枚举 j(相当于体积):
(1)付费油漆匠刷墙 i,那么免费油漆匠就会刷另外time[i]面墙,付费油漆匠刷完墙 i 花费为cost[i],付费和免费两位油漆匠一共刷了time[i]+1面墙。
状态转移方程为 :dp[i][j]=dp[i-1][j-time[i]-1]+cost[i]
(2)免费油漆匠刷墙i,说明此时付费油漆匠正在刷某一面墙,“墙[0,i]中粉刷至少 j 面的最小花费”与“墙[0,i)中粉刷至少 j 面的最小花费”是一样的。
状态转移方程为:dp[i][j]=dp[i-1][j]。
以上两种情况取较小值进行转移即可。
代码:
6893.特别的排列
思路:状态DP
首先定义 dfs(i,j) 表示当前可以选的下标集合为 i,上一个选的数的下标是 j 时,可以构造出多少个特别排列。
递归边界:dfs(0,j)=1,表示找到了一个特别排列。
递归入口:dfs(U\{j},j),其中全集 U={0,1,2,⋯,n−1}。枚举特别排列的第一个数的下标 j,累 加所有 dfs(U\{j},j),即为答案。
代码:
泰裤辣!!
1262.可被三整除的最大和
思路:贪心
由于数组中没有负数,如果整个数组的元素和 s 可以被 3 整除,那么 s 就是最大的元素和。
否则,如果 s 不能被 3 整除,那就看看能否让 s 减去某些 nums[i],使得 s 可以被 3 整除。
找到所有 nums[i]%3=1 的 nums[i],放到数组中;
(1)如果 s%3=1:
a1 不为空,那么答案可能是 s−a1[0]
如果 a2中至少有两个数,那么答案可能是 s−a2[0]−a2[1]这两种情况取最大值。
如果没有这样的数,返回0。(2)如果s%3=2:
如果a2不为空,那么答案可能是s−a2[0];
如果 中至少有两个数,那么答案可能是 s−a1[0]−a1[1];
这两种情况取最大值。如果没有这样的数,返回 0。
代码:
- 点赞
- 收藏
- 关注作者
评论(0)