6.4 note

构造矩阵


class Solution {
private:
    vector<int> empty = {};
    // 返回每个数字(-1)所在的序号,可以是行或列, 如果为空则无效
    vector<int> topoSort(int k, vector<vector<int>>& conditions)
    {
        // 构建一个图: 范围1-k,这里故意留一个0空着,后续计算无需额外-1
        vector<vector<int>> g(k+1);
        // 入度: 范围1-k,这里故意留一个0空着,后续计算无需额外-1
        // vector<int> inDegrees(k+1);
        int inDegrees[k+1];
        memset(inDegrees, 0, sizeof(inDegrees));
        for (vector<int>& condition : conditions)
        {
            g[condition[0]].push_back(condition[1]);
            ++inDegrees[condition[1]];
        }

        // 拓扑排序使用队列
        queue<int> q;
        // 插入入度为0的节点
        for (int i = 1; i <= k; ++i)
        {
            if (inDegrees[i] == 0)
            {
                q.push(i);
            }
        }
        // 计算找到接点的序号:即优先级顺序
        int seq = 0;
        // 返回结果
        vector<int> res(k);
        while (q.size() > 0)
        {
            int curr = q.front();
            q.pop();
            res[curr-1] = seq++;
            for (int next : g[curr])
            {
                if (--inDegrees[next] == 0)
                {
                    q.push(next);
                }
            }
        }

        // 找不到则返回空
        return seq == k ? res : empty;
    }

public:
    vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rowConditions, vector<vector<int>>& colConditions) {
        vector<int> rows = topoSort(k, rowConditions);
        vector<int> cols = topoSort(k, colConditions);
        // 一旦发现有空的情况(即无法满足条件),就可以直接返回空
        if (rows.size() == 0 || cols.size() == 0)
        {
            return {};
        }

        vector<vector<int>> res(k, vector<int>(k));
        for (int i = 0; i < k; ++i)
        {
            // 这里需要额外+1,因为编号是 0~k-1
            res[rows[i]][cols[i]] = i+1;
        }

        return res;
     }
};
 

双指针➕找规律

要改变的最小次数就等于中值,可以通过两端做差再除以2得到最小的变化次数,

然后迭代下去即可,具体实参看代码,时间复杂度O(n)

代码:

class Solution {
public:
    int minOperations(int n) {
        int start = 0;
        int end = n-1;
        int res = 0;
        while(start<end){     //len长奇偶都无关
            res+=((end*2-1)-(start*2-1))/2;
            start++;
            end--;
        }
        return res;
    }
};

算法

1. 计算机编程语言是人类和计算机交流的语言工具。

2. 计算机的本质是状态机,内存里存储的所有数据构成了当前的状态;

3. 数据结构相当于告诉计算机怎么来记录当前的状态,算法相当于告诉计算机怎么根据当前的状态计算出下一个状态。

4. 空间复杂度就是你需要的必需存储的状态最多有多少;

5. 时间复杂度就是从初始状态到达最终状态中间需要多少步,这个和算法强相关,是算法关注的事情;

6. 程序在计算过程中,将问题层层分解之后,会有大量的中间过程数据,这个本质上就是记录问题的中间状态;中间过程数据就是由你设计的数据结 构来承载。

cpp性能优化

 单线程下, 智能指针作为参数传递的时候没有使用引用  每次都拷贝构造 造成了额外的 性能开销 。

只要是个类型变量都可以传参,例如share_ptr

 

错误贪心 lc3458

class Solution {

public:

    bool maxSubstringLength(string s, int k) {

        unordered_map<char,int> hash;

        for(auto c:s)

            hash[c]++;

        int cnt=0;

        for(auto& [a,b]:hash)

        {

            if(b==1) cnt++;

        }

        if(cnt>=k) return true;

        else return false;

    }

};

 

正确贪心:

class Solution {
public:
    bool maxSubstringLength(string s, int K) {
        int n = s.size();

        vector<int> pos[26];
        for (int i = 0; i < n; i++) {
            int c = s[i] - 'a';
            pos[c].push_back(i);
        }

        typedef pair<int, int> pii;
        vector<pii> vec;
        // 枚举每一种子串
        for (int i = 0; i < 26; i++) if (!pos[i].empty()) {
            // 一开始先用这种字母的范围作为子串的范围
            int l = pos[i][0], r = pos[i].back();
            bool flag = true;
            while (flag) {
                flag = false;
                // 检查子串里是否出现了其它字母
                for (int j = 0; j < 26; j++) {
                    int cnt = upper_bound(pos[j].begin(), pos[j].end(), r) - lower_bound(pos[j].begin(), pos[j].end(), l);
                    if (cnt > 0 && cnt < pos[j].size()) {
                        // 有一种字母没有被完全包含,用它的范围更新子串的范围
                        l = min(l, pos[j][0]);
                        r = max(r, pos[j].back());
                        flag = true;
                    }
                }
            }
            // 得到了这种子串里的最短子串
            if (l > 0 || r < n - 1) vec.push_back({r, l});
        }

        // leetcode 435. 无重叠区间
        sort(vec.begin(), vec.end());
        int R = -1, cnt = 0;
        for (pii p : vec) if (p.second > R) {
            R = p.first;
            cnt++;
        }
        return cnt >= K;
    }
};

 

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

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

相关文章

SCSS 全面深度解析

一、SCSS 入门指南&#xff1a;为你的 CSS 工作流注入超能力 在现代 Web 开发中&#xff0c;样式表的复杂性和维护成本日益增加。为了应对这一挑战&#xff0c;CSS 预处理器应运而生&#xff0c;而 SCSS (Sassy CSS) 正是其中最流行、最强大的工具之一。本指南将带你深入了解 …

R1-Searcher++新突破!强化学习如何赋能大模型动态知识获取?

R1-Searcher新突破&#xff01;强化学习如何赋能大模型动态知识获取&#xff1f; 大语言模型&#xff08;LLM&#xff09;虽强大却易因静态知识产生幻觉&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术成破局关键。本文将解读R1-Searcher框架&#xff0c;看其如何通…

图神经网络原理及应用简介

图神经网络&#xff08;Graph Neural Networks, GNNs&#xff09;原理及应用 1. 图神经网络的基本概念 图神经网络是一种专门用于处理图结构数据的深度学习模型。图&#xff08;Graph&#xff09;由节点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09;组成&…

Unity 限制物体在Bounds 包围盒控制移动

我列举两种方式&#xff0c;其实最终都是涉及到包围盒使用问题。可以通过 Box Collider 的 bounds 属性来获取物体的包围盒&#xff08;Bounds&#xff09;也可以直接设置Bounds包围盒使用&#xff0c;从而限制其移动范围。不过需要注意&#xff0c;直接使用 Box Collider 的 s…

SpringBoot中缓存@Cacheable出错

SpringBoot中使用Cacheable: 错误代码&#xff1a; Cacheable(value "FrontAdvertiseVOList", keyGenerator "cacheKey") Override public List<FrontAdvertiseVO> getFrontAdvertiseVOList(Integer count) {return this.list(Wrappers.<Adve…

位集合(STL bitset)简介

【bitset 官方网址】 https://cplusplus.com/reference/bitset/bitset/ 位集合&#xff08;Bit Set&#xff09;是一种高效存储和操作布尔值&#xff08;true/false&#xff09;或二进制位&#xff08;0/1&#xff09;的数据结构&#xff0c;主要用于处理大规模整数集合或状态标…

基于SDN环境下的DDoS异常攻击的检测与缓解

参考以下两篇博客&#xff0c;最后成功&#xff1a; 基于SDN的DDoS攻击检测和防御方法_基于sdn的ddos攻击检测与防御-CSDN博客 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟&#xff08;Ryumininetsflowpostman&#xff09;_mininet模拟dos攻击-CSDN博客 需求 H2 模拟f…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 &#xff08;一&#xff09;模式定义与本质 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个处理者对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有某…

如何进行页面前端监控

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 前端监控主要分三个方向 前端性能&#xff08;用户体验优化&#xff09; 异常监控 业务指标跟 下面我来分别介绍三类指标如何获取 1&#xff09;前端性能指标&#xff1a; …

Ajax技术分析方法全解:从基础到企业级实践(2025最新版)

引言 Ajax技术自2005年正式命名以来,已支撑全球83%的Web应用实现异步交互。2025年最新数据显示,单页面应用(SPA)的Ajax请求密度已达日均120亿次/应用。本文将系统化解析Ajax分析方法论,涵盖从基础原理到企业级工程实践的完整技术栈。 一、Ajax技术架构解构 1.1 核心组件…

git管理github上的repository

1. 首先注册github并创建一个仓库&#xff0c;这个很简单&#xff0c;网上教程也很多&#xff0c;就不展开说了 2. 安装git&#xff0c;这个也很简单&#xff0c;不过这里有个问题就是你当前windows的用户名即&#xff1a;C/Users/xxx 这个路径不要有中文&#xff0c;因为git …

Windows 下部署 SUNA 项目:虚拟环境尝试与最终方案

#工作记录 #回顾总结 本文记录了在 Windows 系统上&#xff0c;通过 PyCharm 图形界面&#xff08;尽量减少命令行操作&#xff09;部署 SUNA 项目时&#xff0c;针对不同虚拟环境方案的尝试过程、遇到的问题以及最终选择的可行方案&#xff0c;并补充了整体部署思路与推荐。…

无向图的点、边双连通分量

文章目录 点双连通分量边双连通分量 有向图的强连通分量&#xff1a;寒假学习笔记【匠心制作&#xff0c;图文并茂】——1.20拓扑、强连通分量、缩点 点双连通分量 在这之前&#xff0c;先让我们了解几个概念。 割点&#xff1a;删除一个点和其连出的边后&#xff0c;原图会…

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型

在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…

Spring @Autowired自动装配的实现机制

Spring Autowired自动装配的实现机制 Autowired 注解实现原理详解一、Autowired 注解定义二、Qualifier 注解辅助指定 Bean 名称三、BeanFactory&#xff1a;按类型获取 Bean四、注入逻辑实现五、小结 源码见&#xff1a;mini-spring Autowired 注解实现原理详解 Autowired 的…

胜牌™全球成为2026年FIFA世界杯™官方赞助商

胜牌全球将首次与国际足联&#xff08;FIFA&#xff09;旗舰赛事建立合作关系。 此次赞助恰逢美国首个润滑油品牌即将迎来160周年之际&#xff0c;其国际扩张步伐正在加快。 在这项全球顶级赛事筹备期间&#xff0c;胜牌全球将通过各种富有创意的零售和体验活动与球迷互动。 …

YOLOV7改进之融合深浅下采样模块(DSD Module)和轻量特征融合模块(LFI Module)

目录 一、研究背景​ 二. 核心创新点​ ​2.1 避免高MAC操作​ ​2.2 DSDM-LFIM主干网络​ 2.3 P2小目标检测分支​ ​3. 代码复现指南​ 环境配置 关键修改点 ​4. 实验结果对比​ 4.1 VisDrone数据集性能 4.2 边缘设备部署 4.3 检测效果可视化 ​5. 应用场景​ …

【C/C++】chrono简单使用场景

chrono使用场景举例 1 输出格式化字符串 示例代码 auto now std::chrono::system_clock::now(); auto t std::chrono::system_clock::to_time_t(now); auto ms std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;std::ostrin…

Med-R1论文阅读理解-1

论文总结&#xff1a;Med-R1: Reinforcement Learning for Generalizable Medical Reasoning in Vision-Language Models 论文写了什么&#xff1f; 本文提出了一种名为 Med-R1 的新框架&#xff0c;旨在通过强化学习&#xff08;Reinforcement Learning, RL&#xff09;提升…

京东热点缓存探测系统JDhotkey架构剖析

热点探测使用场景 MySQL 中被频繁访问的数据 &#xff0c;如热门商品的主键 IdRedis 缓存中被密集访问的 Key&#xff0c;如热门商品的详情需要 get goods$Id恶意攻击或机器人爬虫的请求信息&#xff0c;如特定标识的 userId、机器 IP频繁被访问的接口地址&#xff0c;如获取用…