当前位置: 首页 > news >正文

437贪心

lc3459

memo与方向枚举,在二维网格中查找以1开头、1和2交替出现的最长对角线(含转向)路径长度

1. 确定参数与返回值:DFS参数包含当前位置 (i,j) 、移动方向 k 、转向权限 can_turn 、目标值 target ,返回以当前状态出发的最长交替路径长度。

2. 设置终止条件:计算移动后新位置,若越界或网格值不等于 target ,则路径终止,返回0。

3. 处理当前层逻辑:判断是否可读取记忆化缓存,若 can_turn 为 false 且缓存存在,直接返回缓存值避免重复计算。

4. 递归遍历下一层:先沿原方向递归计算路径长度并加1,若有转向权限,切换方向后再次递归,取两次递归结果的最大值。

5. 记忆化优化:当 can_turn 为 false 时,将当前递归计算的路径长度存入 memo[i][j][k] ,供后续相同状态直接调用

class Solution {
static constexpr int DIRS[4][2] = {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};

public:
int lenOfVDiagonal(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector memo(m, vector<array<int, 4>>(n));

auto dfs = [&](this auto&& dfs, int i, int j, int k, bool can_turn, int target) -> int {
i += DIRS[k][0];
j += DIRS[k][1];
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != target) {
return 0;
}
// 只在 can_turn=false 时读取和写入 memo
if (!can_turn && memo[i][j][k]) {
return memo[i][j][k];
}
int res = dfs(i, j, k, can_turn, 2 - target) + 1;
if (!can_turn) {
return memo[i][j][k] = res;
}
int maxs[4] = {m - i, j + 1, i + 1, n - j}; // 理论最大值(走到底)
k = (k + 1) % 4;
// 优化二:如果理论最大值没有超过 res,那么不递归
if (min(maxs[k], maxs[(k + 3) % 4]) > res) {
res = max(res, dfs(i, j, k, false, 2 - target) + 1);
}
return res;
};

int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != 1) {
continue;
}
int maxs[4] = {m - i, j + 1, i + 1, n - j}; // 理论最大值(走到底)
for (int k = 0; k < 4; k++) { // 枚举起始方向
// 优化一:如果理论最大值没有超过 ans,那么不递归
if (maxs[k] > ans) {
ans = max(ans, dfs(i, j, k, true, 2) + 1);
}
}
}
}
return ans;
}
};

lc3457

贪心

要被舍弃的数尽可能的小

class Solution {

public:

long long maxWeight(vector<int>& pizzas) {

ranges::sort(pizzas, greater<int>());

int days = pizzas.size() / 4;

int odd = (days + 1) / 2;

long long ans = 0;

for (int i = 0; i < odd; i++)

ans += pizzas[i];

for (int i = 0; i < days / 2; i++) {

ans += pizzas[odd + i * 2 + 1];

}

return ans;

}

};

lc3456

class Solution {
public:
bool hasSpecialSubstring(string s, int k) {
int n = s.size();
int cnt = 0;
for (int i = 0; i < n; i++) {
cnt++;
if (i == n - 1 ||s[i] != s[i + 1]){
if (cnt == k)
return true;
cnt = 0;// try update后置0
}
}
return false;
}
};

http://www.jsqmd.com/news/274590/

相关文章:

  • 告别Figma英文界面:这款中文插件让设计效率提升300%
  • JiYuTrainer实战指南:突破极域电子教室权限限制的完整解决方案
  • 基于Springboot+Vue的考研帮平台学习交流生态圈系统(源码+lw+部署文档+讲解等)
  • 终极城通网盘加速指南:3步实现免费高速直链下载
  • 亲测好用2026自考AI论文写作软件TOP8:开题报告文献综述全测评
  • 基于Springboot+Vue的林业资源管理系统(源码+lw+部署文档+讲解等)
  • MOOTDX通达信数据接口:Python量化分析的终极解决方案
  • 为什么你的电脑总缺DLL文件?3步彻底解决Visual C++运行库问题
  • Windows驱动管理终极指南:Driver Store Explorer高效使用手册
  • Video2X视频增强技术完全指南:从零基础到专家级应用
  • MyTV-Android:面向老旧电视设备的跨代兼容技术方案
  • B站视频下载终极指南:3步搞定4K高清离线收藏
  • 鸣潮性能优化实战手册:从60帧到120帧的完美升级方案
  • 揭秘Cowabunga Lite:免越狱iOS系统定制的技术架构革命
  • 精通RTL8852BE Wi-Fi 6驱动:从零开始的深度实战指南
  • 抖音视频批量采集系统:从零搭建个人素材库
  • 兰亭妙微干货:B 端界面设计五大核心原则,筑牢企业级产品实用根基
  • ScratchJr桌面版全方位指南:打造儿童编程启蒙第一课
  • AMD Ryzen性能调试工具完全指南:从零掌握硬件调优技术
  • scBert的输入是什么?怎么构造的,有例子吗?
  • TFT Overlay云顶之弈辅助工具:7天从入门到精通的快速提升指南
  • DSView:从零开始掌握开源信号分析工具
  • Python抖音批量下载神器:3步构建专属视频素材库
  • 虚拟滚动(Virtual Scrolling)
  • 英雄联盟自动化工具League Akari完整使用教程:从安装到精通
  • OpenCore Legacy Patcher深度解析:让老旧Mac重获新生的完美方案
  • 2小时极速指南:让老款Mac完美运行最新macOS系统
  • 2026景区溶洞假山设计正规公司推荐榜:太空舱民宿修建/打造萌宠民宿/景区民宿修建/木屋民宿打造/民宿生产施工/选择指南 - 优质品牌商家
  • AI推理真相:大型喃喃自语模型如何“忽悠“整个科技圈?
  • 双证认证落袋!熊家无二领跑韩式炸鸡赛道 - 中媒介