TikTok真题第5天 | 386. 字典序排数、785.判断二分图、886.可能的二分法

386. 字典序排数

题目链接:386.exicographical-numbers

解法:

解法1:DFS,也就是回溯。第一层从1开始,遍历到9,而后面层的循环,也就是递归,从0遍历到9。如果当前节点的数大于n了,那就回溯。但是DFS递归的空间复杂度大于O(1)。

参考【宫水三叶】的题解:DFS(回溯)

解法2:迭代法。对于一个整数 number=1,按照一定的规则去找他的下一个字典序整数,并不断加入结果集中。由于只是不断更新number,所以额外空间为O(1)。更新规则如下:

迭代看了这个规则也不太好理解,把代码模拟运行一下就理解了。

比如第二个条件,n=234时,如果number=199了,那么199 / 10 = 19, 19 / 10 = 1, 1+1=2,也是后面的字典序整数就是:2, 20, 200,..., 21,...。

如果number=234了,那么234 / 10 = 23, 23+1 = 24,那么后面的字典序整数就是:24, 25, ..., 29

参考题解:leetcode官网迭代法

边界条件:无

时间复杂度:O(n)

空间复杂度:回溯O(n),迭代O(1)

// 回溯
class Solution {
    vector<int> result;
public:
    vector<int> lexicalOrder(int n) {
        // 第一层遍历从1到9,因为0不能作为开头
        for (int i=1; i<=9; i++) {
            traversal(i, n);
        }
        return result;
    }
private:
    void traversal(int cur, int limit) {
        if (cur > limit) return;
        result.push_back(cur);
        for (int i=0; i<=9; i++) {
            cur = cur * 10 + i;
            // 横向剪枝
            if (cur > limit) break;
            traversal(cur, limit);
            // 为了清晰地展示回溯撤销的操作,没有合并
            cur = (cur - i) / 10;
        }
    }
};
// 迭代法
class Solution {
public:
    vector<int> lexicalOrder(int n) {
        vector<int> result(n);
        int cur = 1;
        for (int i=0; i<n; i++) {
            result[i] = cur;
            if (cur * 10 <= n) {
                cur *= 10;
            } else {
                // 比如n=234,cur=199,那么需要回撤到1,再从2开始
                while (cur % 10 == 9 || cur + 1 > n) {
                    cur /= 10;
                }
                cur++;
            }
        }
        return result;
    }
};

785.判断二分图

题目链接:785.is-graph-bipartite

解法:

这个题有两种解法:染色法和并查集。并查集本身就是一个很大的内容,所以这里只用染色法。

任选一个节点开始,给它染成红色。随后我们对整个图进行遍历,将该节点直接相连的所有节点染成绿色,表示这些节点不能与起始节点属于同一个集合。我们再将这些绿色节点直接相连的所有节点染成红色,以此类推,直到无向图中的每个节点均被染色。

而如果在过程中,节点直接相邻的节点存在颜色和该节点相同(之前已经被染过),那么染色失败。

解题思路参考:leetcode官网染色法

官网的思路很清晰,但代码实现不简洁,具体代码实现还参考了:知乎染色法

边界条件:

时间复杂度:O(n+m),其中 n 和 m分别是无向图中的点数和边数。

空间复杂度:O(n),存储节点颜色的数组需要 O(n) 的空间,并且在深度优先搜索的过程中,栈的深度最大为 n,需要 O(n)的空间。

// DFS染色法
class Solution {
    static constexpr int UNCOLORED = 0;
    static constexpr int RED = 1;
    static constexpr int GREEN = 2;
    vector<int> colors;
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        colors.assign(n, UNCOLORED);
        for (int i=0; i<n; i++) {
            if (colors[i] == UNCOLORED) {
                if (!dfs(i, RED, graph)) return false;
            }
        }
        return true;
    }

    bool dfs(int cur, int color, vector<vector<int>>& graph) {
        // 参数color是cur应该染的颜色
        // 如果cur已经被染色,但已经染的颜色不是color,表明染色失败
        if (colors[cur] != UNCOLORED) {
            return colors[cur] == color;
        }
        colors[cur] = color;
        // 这是邻接点应该染的颜色,和cur的不同
        int colorNext = color == RED? GREEN: RED;
        for (int next: graph[cur]) {
            // 遍历所有邻接点,如果该染的颜色和已经染的不同,则失败
            if (!dfs(next, colorNext, graph)) return false;
        }
        return true;
    }
};

886.可能的二分法

题目链接:886.possible-bipartition

解法:

这个题是上一个题的加强版,也是用染色法或者并查集解决,所以在做此题之前,先把上一个题干掉了。这个tag题的出题频率更高。

这个题其实就比785改动了两个地方:(1)需要自己构建邻接表;(2)点的起始值是1而不是0。

也就是说,只要我们构建好邻接表,然后把起始值从1改为0,那就可以完全复用785的代码了。

参考题解:LeetCode 886 - 可能的二分法 (Python3|Go)[递归/DFS] Possible Bipartition - 知乎

边界条件:无

时间复杂度:O(n+m)

空间复杂度:O(n)

//染色法
class Solution {
    static constexpr int UNCOLORED = 0;
    static constexpr int RED = 1;
    static constexpr int GREEN = 2;
    vector<int> colors;
public:
    bool possibleBipartition(int n, vector<vector<int>>& dislikes) {
        // 构建邻接表
        vector<vector<int>> graph(n);
        for (const auto& dis: dislikes) {
            int a = dis[0] - 1;
            int b = dis[1] - 1;
            graph[a].push_back(b);
            graph[b].push_back(a);
        }
        return isBipartite(graph);
    }

    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        colors.assign(n, UNCOLORED);
        for (int i=0; i<n; i++) {
            if (colors[i] == UNCOLORED) {
                if (!dfs(i, RED, graph)) return false;
            }
        }
        return true;
    }

    bool dfs(int cur, int color, vector<vector<int>>& graph) {
        // 参数color是cur应该染的颜色
        // 如果cur已经被染色,但已经染的颜色不是color,表明染色失败
        if (colors[cur] != UNCOLORED) {
            return colors[cur] == color;
        }
        colors[cur] = color;
        // 这是邻接点应该染的颜色,和cur的不同
        int colorNext = color == RED? GREEN: RED;
        for (int next: graph[cur]) {
            // 遍历所有邻接点,如果该染的颜色和已经染的不同,则失败
            if (!dfs(next, colorNext, graph)) return false;
        }
        return true;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某ZF型酒店警卫队精细化管理项目成功案例纪实

——建立治安联防体系及事故处理预案&#xff0c;全面保障领导安全 警卫队是招待所不可或缺的一部分&#xff0c;他们的合理设置能够保障人员的生命和财产安全。然而对于警卫队的管理存在着许多问题&#xff1a;警卫的素质不高、没有责任心、应急能力不高以及岗位设置上的不合理…

前端,build后index报错,noscript

解决方法&#xff1a; npx update-browserslist-dblatest

C++篇 memset() 函数 数组初始化

#include<cstring> int a[1024]; memset(a,1,sizeof(a)); a数组元素值将全部初始化为16843009&#xff0c;为什么会这样呢&#xff1f; memset()函数原理是对内存块中字节元素进行初始化&#xff0c;上述代码中每字节将初始化为十六进制下ox01&#xff0c;(1字节8bit o…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

Failed to resolve component: router-view

出现了这个问题&#xff0c;导致本该出现的页面没有出现&#xff0c;在网上看了解决办法&#xff0c;原来是没有挂载好app 原先代码&#xff1a; app.use(router) createApp(App).mount(#app) //这是又创建了一个新的app&#xff0c;无法使用到router改进&#xff1a; app.…

【MySQL】数据库规范化的三大法则 — 一探范式设计原则

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 第一范式&#xff08;1NF&#xff09;&#xff1a; 2. 第二范式&#xff08;2NF&#xff09;&#xff1a; 3. 第三范式…

如何利用云渲染进行批量效果图渲染?

在设计与建筑领域内&#xff0c;创意的视觉呈现对客户影响深远&#xff0c;而实现这一目标的关键在于高质量的效果图&#xff0c;手动渲染大量效果图不仅费时还对资源的需求极高。利用云渲染技术&#xff0c;尤其是依托云渲染等先进平台&#xff0c;设计师们可以轻松地应对大批…

linux 下批量重放流量

目录 介绍实操linux方式1&#xff0c;2linux 方式3 介绍 这里介绍的是&#xff0c;如何在 linux 环境下让IDP设备告警 这里linux下流量重放的工具是&#xff1a;tcpreplay 工具的作用&#xff1a;将PCAP包重新发送&#xff0c;用于性能或者功能测试工具的使用与参数&#xff…

VMvare虚拟机之文件夹共享与防火墙设置

共享文件夹 什么是共享文件夹 共享文件夹是一种在网络上共享文件和文件夹的方法。它允许多个用户通过网络连接到共享文件夹&#xff0c;并可以访问其中的文件和文件夹&#xff0c;进行文件的读取、修改、删除等操作。共享文件夹可以用于方便地共享文件和协作工作&#xff0c;…

详解ibm_t60(945)的板子的保护隔离和ec的待机供电

1.,首先看ec待机条件: 待机供电&#xff0c;32k时钟&#xff0c;复位&#xff0c;适配器检测&#xff0c;开关信号。但是视频居然是找适配器的接口&#xff0c;跟着视频走&#xff0c;所以我先找打了适配器接口j24。vint20为公共点&#xff0c;我查了vint20的所有接线发现没有小…

k8s中的整体架构 ,pod含义,服务类型,网络通讯等

k8s中的整体架构 &#xff0c;pod含义&#xff0c;服务类型&#xff0c;网络通讯等 k8s整体架构pod内部和pod之间的通讯k8s的组件 k8s整体架构 上图中&#xff0c;较大的红框是k8s中的master节点&#xff0c;负责接受请求&#xff0c;调度任务&#xff0c;管理节点等&#xff0…

轻量级开源服务器Tomcat本地部署并将网页发布到公网远程访问

目录 1.前言 2.本地Tomcat网页搭建 2.1 Tomcat安装 2.2 配置环境变量 2.3 环境配置 2.4 Tomcat运行测试 2.5 Cpolar安装和注册 3.本地网页发布 3.1.Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通…

PSINS中的各类更新代码解析

1、姿态更新 更新原理 微分方程 因为离散化比较复杂&#xff0c;所以采用矩阵链转换 更新也就是找到前后时刻的关系。下面是推导逻辑&#xff0c; PSINS中的涉及到的代码 需要注意的是叫增量采用的增量时刻不同&#xff0c;n系下是用【T/2,T】的姿态表示【T,2T】的姿态变化…

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…

火热报名中·2024北京国际人工智能展览会(世亚智博会)

随着科技的飞速发展&#xff0c;人工智能已经成为当今世界最为炙手可热的话题之一。作为科技领域的热点&#xff0c;人工智能不仅引领着科技创新的方向&#xff0c;更在各个领域中发挥着越来越重要的作用。为了更好地展示人工智能领域的最新成果和前沿技术&#xff0c;2024北京…

Neo4j 5.15 windows安装

1&#xff0c;什么是图数据库&#xff1f; 着社交、电商、金融、互联网那个等快速发展&#xff0c;现实社会织起了一张庞大复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系呈集合 数级增长&#xff0c;急需一种支持海量复杂数据关系…

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记 Abstract 搭载摄像头的无人机可以从更广阔的视角在空中动态跟踪目标&#xff0c;与静态摄像头或地面移动传感器相比具有优势。然而&#xff0c;由于外观变化和严重遮挡等多种因素&#xff0c;使…

2015年第四届数学建模国际赛小美赛B题南极洲的平均温度解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 B题 南极洲的平均温度 原题再现&#xff1a; 地表平均温度是反映气候变化和全球变暖的重要指标。然而&#xff0c;在以前的估计中&#xff0c;在如何界定土地平均数方面存在一些方法上的差异。为简单起见&#xff0c;我们只考虑南极洲。请建…

数字大师:数据可视化助力企业智慧成本管理

在当今竞争激烈的商业环境中&#xff0c;企业要想取得成功&#xff0c;不仅需要不断创新&#xff0c;还需要高效管理资源&#xff0c;降低成本。数据可视化作为一项强大的工具&#xff0c;为企业提供了更清晰、更直观的经营洞察&#xff0c;从而帮助企业实现成本的有效控制和节…

美股60年牛熊周期启示,紧扣周期特点和产业趋势才是王道

2023年&#xff0c;美股在地缘政治时间频发、美联储加息以及银行危机中扶摇直上&#xff0c;标普500指数迄今已攀升超过24%&#xff0c;令投资者感到惊讶。回顾美股近60年历史&#xff0c;美股今年的表现也并不算特别。 《XM平台新用户注册最新操作流程&#xff08;2023年&…