7.11 dp 图

 

lcr148.栈

按放入顺序推栈,能弹出的就及时弹出,最后栈空则符合要求。

判断 takeOut 序列是否符合栈的操作逻辑,因为题目中“特殊的数据结构”其实就是栈(先进后出)。

思路如下:

1. 用一个栈来模拟图书放入的过程。
2. 按 putIn 的顺序依次将图书推入栈中。
3. 每次推入后,检查栈顶元素是否和 takeOut 当前待匹配的元素相同:
- 如果相同,就弹出栈顶元素,并移动 takeOut 的匹配指针。
- 重复此检查,直到栈顶元素和待匹配元素不同。
4. 当 putIn 的元素全部处理完后,若栈为空,说明 takeOut 是正确的拿取序列,返回 true ;否则返回 false 。

class Solution {

public:

    bool validateBookSequences(vector<int>& putIn, vector<int>& takeOut) 

    {

        stack<int> st;

        int i=0;

        for(int& p:putIn)

        {

            st.push(p);

            

 while(!st.empty() && st.top()==takeOut[i])

            {

                st.pop();

                i++;

            }

           

        }

        return st.empty();

    }

};

lc2316.dfs无向图联通块计算

class Solution {
public:
long long countPairs(int n, vector<vector<int>> &edges) {
vector<vector<int>> g(n);
for (auto &e: edges) {
int x = e[0], y = e[1];
g[x].push_back(y);
g[y].push_back(x); // 建图
}

        vector<int> vis(n);
function<int(int)> dfs = [&](int x) -> int {
vis[x] = true; // 避免重复访问同一个点
int size = 1;
for (int y: g[x]) {
  if (!vis[y]) {
size += dfs(y);

}
}
return size;
};

        long long ans = 0;
for (int i = 0, total = 0; i < n; i++) {
  if (!vis[i]) { // 未访问的点:说明找到了一个新的连通块
int size = dfs(i);
ans += (long) size * total;

total += size;
}
}
return ans;
}
};

lc1042. 不领接植花

邻接表涂色

给花园涂色:

1. 建邻接表
2. 涂色时,先看它相邻的用了什么颜色(记在 used 里)。
3.  找第一个没被用过的颜色,给当前花园涂上。

最后返回所有花园的颜色数组

class Solution {
public:
vector<int> gardenNoAdj(int n, vector<vector<int>>& paths) {
// 邻接表存连接关系
vector<vector<int>> g(n);
for (auto& p : paths) {
// 花园编号转成0开始(原是1开始)
int x = p[0] - 1, y = p[1] - 1;
g[x].push_back(y);
g[y].push_back(x);
}

        // 存每个花园的颜色(1-4)
vector<int> color(n);
for (int i = 0; i < n; i++)

          {
// 记录邻居用过的颜色
bool used[5] = {false};
for (int j : g[i]) {
used[color[j]] = true;
}

            // 找第一个没被用过的颜色
int c = 1;

while (used[c]) {
c++;
}
color[i] = c;
}
return color;
}
};

 

lc3186.施咒

 

dp[i] 表示“考虑前i个不同数字时,能得到的最大总和”。

排好序后,对每个数字,要么跳过它,要么选它(同时只能搭配前面和它差≥3的数字),始终选总和最大的方案。

注意,就在于对于重复值的处理


1. 先整理数据:统计每个数字出现的次数(比如数字5出现3次,总和就是5×3),再把数字从小到大排序。
2. 动态规划记录最大和:用 dp[i] 表示“考虑前i个不同数字时,能得到的最大总和”。


3. 核心逻辑:
- 对每个数字 x (带次数 c ),先找最前面一个“和 x 的差小于3”的数字位置 j (意味着 j 之前的数字都能和 x 共存)。
- 决策:要么不选 x ,总和就是 f[i] (继承前i-1个的结果);要么选 x ,总和就是 f[j] + x×c ( j 之前的最大和加上 x 的总贡献),取两者更大的那个。


4. 最终结果: f[n] 就是考虑所有数字后能得到的最大总和。

class Solution {
public:
long long maximumTotalDamage(vector<int>& power) {
unordered_map<int, int> cnt;
for (int x : power) {
cnt[x]++;
}

        vector<pair<int, int>> a(cnt.begin(), cnt.end());    //hash转化方法
sort(a.begin(),a.end());

        int n = a.size();
vector<long long> f(n + 1);
for (int i = 0, j = 0; i < n; i++)

          {
auto& [x, c] = a[i];
while (a[j].first < x - 2)

            {
  j++;   // 利用了单调性
}
 f[i + 1] = max(f[i], f[j] + (long long) x * c);

//选不选
}
return f[n];
}
};

 

 

lc2222. 状态机dp

简单dp:

 dp[k][j]  记录“选  k  个字符、最后是  j ”的方案数,

class Solution {
typedef long long ll;
public:
long long numberOfWays(string s)
{

int n=s.size();
if(n<3) return 0;
vector<vector<ll>> dp(4,vector<ll>(2,0));
dp[0][1]=dp[0][0]=1;

for(int i=0;i<n;i++)  //遍历子串,填表
{
//k要倒着加,要不然就多加了
for(int k=3;k>=1;k--)

{
if(s[i]=='0')
dp[k][0]+=dp[k-1][1];
else
dp[k][1]+=dp[k-1][0];
}
}
return dp[3][0]+dp[3][1];
}
};

k  倒着遍历是为了 确保状态转移时, dp[k-1][...]  用的是“上一轮”的旧值,避免当前轮更新的

 


lc442. 数组中重复的数据

模拟hash映射的原理  o(n)且不额外空间

“原地标记”

  • 压榨完num的价值,数组自身的下标和符号 代替哈希表,num遍历查看完一个元素后,还原地通过符号标记修改。
  • 利用了数也在1,n范围的特性

找出数组里恰好出现两次的数,返回这些数。

常规思路(哈希表,空间不够好)

优化思路(原地标记,空间 O(1))

 

利用数组下标和元素值的特殊关系:

- 数组长度是 n,元素值范围是  [1, n] ,下标范围是  [0, n-1] 。

- 可以把下标和元素值对应起来(比如值为 num 的数,对应下标 num-1  ),通过改元素正负,标记这个数是否出现过。

 

具体步骤(遍历+标记)

1. 遍历数组,对当前数 num :

- 先取绝对值(因为可能被改过符号),算对应下标  index = |num| - 1 ;

- 看 nums[index] 的符号:

- 若为正:说明 num 是第一次出现,把 nums[index] 改成负数(标记“已访问”);

- 若为负:说明 num 之前出现过,现在是第二次,把 num 加入结果(这就是重复的数)。

 

举个例子

比如数组是  [4,3,2,7,8,2,3,1] :

- 遍历到 4 ,对应下标 4-1=3 , nums[3] 是 7 (正)→ 改成 -7 ;

- 遍历到 3 ,对应下标 3-1=2 , nums[2] 是 2 (正)→ 改成 -2 ;

- ……

- 遍历到 2 ,对应下标 2-1=1 , nums[1] 是 -3 (负)→ 说明 2 重复,加入结果;

- 最终找出所有重复两次的数。

 

核心巧妙点

数组自身的下标和符号代替哈希表,不用额外空间,完美解决“找重复两次的数”的问题,时间 O(n)、空间 O(1) 。

 

class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> duplicates;
int n = nums.size();
for (int i = 0; i < n; i++) {
int num = nums[i];
int index = abs(num) - 1;
  if (nums[index] > 0) {
nums[index] = -nums[index];

}

          else {
duplicates.push_back(index + 1);
}
}
return duplicates;
}
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914381.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react16-react19都更新哪些内容?

React 16 到 React 19 是 React 发展非常关键的阶段&#xff0c;每个版本都带来了深远影响。以下是 React 16 → 19 的重要更新列表&#xff0c;按版本详细说明每一代的核心特性、重要变化、对开发者的意义&#xff0c;并附简评&#xff1a;✅ React 16&#xff08;2017 年&…

【AI大模型】RAG系统组件:向量数据库(ChromaDB)

RAG 系统中的关键组件&#xff1a;向量数据库&#xff08;Vector Database&#xff09;&#xff0c;并以 ChromaDB 为例进行说明。什么是向量数据库&#xff1f;核心概念&#xff1a; 向量数据库是一种专门设计用于高效存储、索引和检索高维向量的数据库。向量是什么&#xff1…

006_测试评估与安全实践

测试评估与安全实践 目录 建立成功标准评估方法测试策略安全最佳实践隐私保护性能监控 建立成功标准 定义原则 1. 具体明确 清晰定义精确目标避免模糊表述如"良好性能"制定可操作的标准 不好的标准&#xff1a; 模型应该表现良好好的标准&#xff1a; 情感分…

时序预测 | Pytorch实现CNN-KAN电力负荷时间序列预测模型

预测效果 代码功能 该代码实现了一个结合卷积神经网络&#xff08;CNN&#xff09;和Kolmogorov–Arnold网络&#xff08;KAN&#xff09;的混合模型&#xff08;CNN-KAN&#xff09;&#xff0c;用于时间序列预测任务。核心功能包括&#xff1a; 数据加载与预处理&#xff1…

UI前端与数字孪生结合实践探索:智慧物流的仓储优化与管理系统

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;仓储管理的 “数字孪生革命”传统物流仓储正面临 “效率瓶颈、可视化差、响应滞…

【Android】在平板上实现Rs485的数据通讯

前言 在工业控制领域&#xff0c;Android 设备通过 RS485 接口与 PLC&#xff08;可编程逻辑控制器&#xff09;通信是一种常见的技术方案。最近在实现一个项目需要和plc使用485进行通讯&#xff0c;记录下实现的方式。 我这边使用的从平的Android平板&#xff0c;从平里面已经…

MySQL技术笔记-备份与恢复完全指南

目录 前言 一、备份概述 &#xff08;一&#xff09;备份方式 &#xff08;二&#xff09;备份策略 二、物理备份及恢复 &#xff08;一&#xff09;备份操作 &#xff08;二&#xff09;恢复操作 三、逻辑备份及恢复 &#xff08;一&#xff09;逻辑备份 &#xff0…

SpringBoot或OpenFeign中 Jackson 配置参数名蛇形、小驼峰、大驼峰、自定义命名

SpringBoot或OpenFeign中 Jackson 配置参数名蛇形、小驼峰、大驼峰、自定义命名 前言 在调用外部接口时&#xff0c;对方给出的接口文档中&#xff0c;入参参数名一会大写加下划线&#xff0c;一会又是驼峰命名。 示例如下&#xff1a; {"MOF_DIV_CODE": "xx…

uni-app 途径站点组件开发与实现分享

在移动应用开发中&#xff0c;涉及到出行、物流等场景时&#xff0c;途径站点的展示是一个常见的需求。本文将为大家分享一个基于 uni-app 开发的途径站点组件&#xff0c;该组件能够清晰展示路线中的各个站点信息&#xff0c;包括站点名称、到达时间、是否已到达等状态&#x…

kotlin中集合的用法

从一个实际应用看起以下kotlin中代码语法正确吗 var testBeanAIP0200()var testList:List<AIP0200> ArrayList()testList.add(testBean)这段Kotlin代码存在语法错误&#xff0c;主要问题在于&#xff1a;List<AIP0200> 是Kotlin中的不可变集合接口&#xff0c;不能…

深入理解 Java Map 与 Set

文章目录前言1. 搜索树1.1 什么是搜索树1.2 查找1.3 插入1.4 删除情况一&#xff1a;cur 没有子节点&#xff08;即为叶子节点&#xff09;情况二&#xff1a;cur 只有一个子节点&#xff08;只有左子树或右子树&#xff09;情况三&#xff1a;cur 有两个子节点&#xff08;左右…

excel如何只保留前几行

方法一&#xff1a;手动删除多余行 选中你想保留的最后一行的下一行&#xff08;比如你只保留前10行&#xff0c;那选第11行&#xff09;。按住 Shift Ctrl ↓&#xff08;Windows&#xff09;或 Shift Command ↓&#xff08;Mac&#xff09;&#xff0c;选中从第11行到最…

实时连接,精准监控:风丘科技数据远程显示方案提升试验车队管理效率

风丘科技推出的数据远程实时显示方案更好地满足了客户对于试验车队远程实时监控的需求&#xff0c;并真正实现了试验车队的远程管理。随着新的数据记录仪软件IPEmotion RT和相应的跨平台显示解决方案的引入&#xff0c;让我们的客户端不仅可在线访问记录器系统状态&#xff0c;…

灰盒级SOA测试工具Parasoft SOAtest重新定义端到端测试

还在为脆弱的测试环境、强外部依赖和低效的测试复用拖慢交付而头疼&#xff1f;尤其在银行、医疗、制造等关键领域&#xff0c;传统的端到端测试常因环境不稳、接口难模拟、用例难共享而举步维艰。 灰盒级SOA测试工具Parasoft SOAtest以可视化编排简化复杂测试流程&#xff0c…

OKHttp 核心知识点详解

OKHttp 核心知识点详解 一、基本概念与架构 1. OKHttp 简介 类型&#xff1a;高效的HTTP客户端特点&#xff1a; 支持HTTP/2和SPDY&#xff08;多路复用&#xff09;连接池减少请求延迟透明的GZIP压缩响应缓存自动恢复网络故障2. 核心组件组件功能OkHttpClient客户端入口&#…

从“被动巡检”到“主动预警”:塔能物联运维平台重构路灯管理模式

从以往的‘被动巡检’转变至如今的‘主动预警’&#xff0c;塔能物联运维平台对路灯管理模式展开了重新构建。城市路灯属于极为重要的市政基础设施范畴&#xff0c;它的实际运行状态和市民出行安全以及城市形象有着直接且紧密的关联。不过呢&#xff0c;传统的路灯管理模式当下…

10. 常见的 http 状态码有哪些

总结 1xx: 正在处理2xx: 成功3xx: 重定向&#xff0c;302 重定向&#xff0c;304 协商缓存4xx: 客户端错误&#xff0c;401 未登录&#xff0c;403 没权限&#xff0c;404 资源不存在5xx: 服务器错误常见的 HTTP 状态码详解 HTTP 状态码&#xff08;HTTP Status Code&#xff0…

springBoot对接第三方系统

yml文件 yun:ip: port: username: password: controller package com.ruoyi.web.controller.materials;import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.materials.service.IYunService; import o…

【PTA数据结构 | C语言版】车厢重排

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 一列挂有 n 节车厢&#xff08;编号从 1 到 n&#xff09;的货运列车途径 n 个车站&#xff0c;计划在行车途中将各节车厢停放在不同的车站。假设 n 个车站的编号从 1 到 n&#xff0c;货运列车按照…

量子计算能为我们做什么?

科技公司正斥资数十亿美元投入量子计算领域&#xff0c;尽管这项技术距离实际应用还有数年时间。那么&#xff0c;未来的量子计算机将用于哪些方面&#xff1f;为何众多专家坚信它们会带来颠覆性变革&#xff1f; 自 20 世纪 80 年代起&#xff0c;打造一台利用量子力学独特性质…