代码随想录第26天 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独

news2025/1/11 9:47:40

332. 重新安排行程

      /**
       * @param {string[][]} tickets
       * @return {string[]}
       */
      var findItinerary = function (tickets) {
        let s = "ZZZ";
        let start;
        for (let i in tickets) {
          if (tickets[i][0] === "JFK" && tickets[i][1] < s) {
            start = i;
            s = tickets[i][1];
          }
        }
        let count = tickets.length;
        let result = [];
        let path = [tickets[start]];
        let uset = new Array(count);
        uset.fill(0);
        uset[start] = 1;
        backtracing(tickets, uset);
        result = result[0];
        let road = result[0];

        for (let i in result) {
          if (i > 0 && i < result.length) road.push(result[i][1]);
        }

        return road;
        function backtracing(tickets, uset) {
          if (path.length === count) {
            result.push(path.slice());
          }
          for (let i = 0; i < count; i++) {
            if (uset[i]) {
              continue;
            }

            if (path[path.length - 1][1] === tickets[i][0]) {
              path.push(tickets[i]);
              uset[i] = 1;
              backtracing(tickets, uset);
              path.pop();
              uset[i] = 0;
            }
            
          }
        }
      };

第一想法

如上,可以解决他给的例子(解决了字典和排序),但是不能解决[[“JFK”,“KUL”],[“JFK”,“NRT”],[“NRT”,“JFK”]],按照最小的字典来,没办法


题解(边表桶):

const findItinerary = (tickets) => {
  const res = ['JFK']; // 初始放入起点'JFK'
  const map = {};      // 邻接表

  for (const ticket of tickets) { // 遍历tickets,建表
    const [from, to] = ticket;    // 每一张机票,读出起点和终点
    if (!map[from]) {
      map[from] = []; // 初始化
    }
    map[from].push(to); // 建立映射
  }

  for (const city in map) { // 按照字母顺序,小的在前
    map[city].sort();
  }

  const dfs = (city, used) => { // city是当前访问的城市、used是已用掉的机票数
    if (used == tickets.length) { // 用光了所有机票,路径找到了
      return true;
    };
    const nextCities = map[city]; // 获取下一站能去的城市list
    if (!nextCities || nextCities.length == 0) { // 没有邻接城市了
      return false; // 还没用光机票,就没有下一站了,返回false
    }
    for (let i = 0; i < nextCities.length; i++) { // 设置出各种选项(递归分支)
      const next = nextCities[i]; // 当前选择的下一站
      nextCities.splice(i, 1);    // 飞出地的list中删掉这一站
      res.push(next);             // 将该选择推入res
      if (dfs(next, used + 1)) {  // 在该递归分支中能找到一个用完所有机票的路径
        return true;
      } else {
        nextCities.splice(i, 0, next); // 将删掉的这一站重新插回去
        res.pop();                     // 推入res的选择,也撤销
      }
    }
  };

  dfs('JFK', 0); // 从'JFK'城市开始遍历,当前用掉0张机票
  return res;
};

51. N皇后

      /**
       * @param {number} n
       * @return {string[][]}
       */
      result = [];
      var solveNQueens = function (n) {
        // n 为输入的棋盘大小
        // row 是当前递归到棋盘的第几行了
        result = [];
        let chessboard = new Array(n).fill(0).map(() => new Array(n).fill("."));
        backtracking(n, 0, chessboard);
        return result;
      };
      function transformChessBoard(chessBoard) {
        let chessBoardBack = [];
        chessBoard.forEach((row) => {
          let rowStr = "";
          row.forEach((value) => {
            rowStr += value;
          });
          chessBoardBack.push(rowStr);
        });

        return chessBoardBack;
      }
      function backtracking(n, row, chessboard) {
        if (row === n) {
          result.push(transformChessBoard(chessboard));
          return;
        }
        for (let col = 0; col < n; col++) {
          if (isValid(row, col, chessboard, n)) {
            // 验证合法就可以放
            chessboard[row][col] = "Q"; // 放置皇后
            backtracking(n, row + 1, chessboard);
            chessboard[row][col] = "."; // 回溯,撤销皇后
          }
        }
      }
      function isValid(row, col, chessboard, n) {
        // 列
        for (let i = 0; i < row; i++) {
          //注意i<row
          if (chessboard[i][col] === "Q") {
            return false;
          }
        }

        // 45度
        for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
          if (chessboard[i][j] === "Q") {
            return false;
          }
        }

        // 135度
        for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
          if (chessboard[i][j] === "Q") {
            return false;
          }
        }
        return true;
      }

思想

在这里插入图片描述

困难

传到最后,chessbord回溯了,全部回到了过去。
所以另开一个数组去记载chessBoardBack = [];

37.解数独

var solveSudoku = function(board) {
    function isValid(row, col, val, board) {
        let len = board.length
        // 行不能重复
        for(let i = 0; i < len; i++) {
            if(board[row][i] === val) {
                return false
            }
        }
        // 列不能重复
        for(let i = 0; i < len; i++) {
            if(board[i][col] === val) {
                return false
            }
        }
        let startRow = Math.floor(row / 3) * 3
        let startCol = Math.floor(col / 3) * 3

        for(let i = startRow; i < startRow + 3; i++) {
            for(let j = startCol; j < startCol + 3; j++) {
                if(board[i][j] === val) {
                    return false
                }
            }
        }

        return true
    }

    function backTracking() {
        for(let i = 0; i < board.length; i++) {
            for(let j = 0; j < board[0].length; j++) {
                if(board[i][j] !== '.') continue
                for(let val = 1; val <= 9; val++) {
                    if(isValid(i, j, `${val}`, board)) {
                        board[i][j] = `${val}`
                        if (backTracking()) {
                            return true
                        }

                        board[i][j] = `.`
                    }
                }
                return false
            }
        }
        return true
    }
    backTracking(board)
    return board

}

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

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

相关文章

密码学学习笔记(十三):哈希函数 - Merkle–Damgård结构

Merkle–Damgrd是一种算法&#xff0c;由Ralph Merkle和Ivan Damgrd提出。它通过迭代调用压缩函数来计算消息的哈希值。 应用 拿SHA-2举例&#xff0c;首先我们需要对需要进行哈希运算的输入做填充&#xff0c;然后将填充后的输入划分为等长的分组&#xff0c;每个分组的长度…

uniapp 土法 瀑布流 - vue3

效果图 代码 <template><view><!-- 瀑布流展示 --><!-- 标签页 --><view class="rowStart flexNoLineBreaking paddingCol10 innerDomPaddingRow5 tinyShadow marginBottom10"><view @click="tabsCurrent = 0; run_waterfa…

计算机网络基础第六章

一、应用层概述 1.1 网络应用模型 1.1.1 客户/服务器(C/S)模型 1.1.2 P2P模型 二、域名解析系统——DNS系统 2.1 域名 2.2 域名服务器 2.3 域名解析过程 三、文件传输协议——FTP 3.1 FTP服务器和用户端 3.2 FTP工作原理 四、电子邮件 4.1 电子邮件系统概述 4.2 简单邮件传送…

C# Modbus通信从入门到精通(1)——Modbus RTU(虚拟串口调试工具的使用)

前言: 订阅本专栏后,加入vip专属的qq群,在群资料里面就能找到虚拟串口工具 1、安装虚拟串口工具 第1步、双击vspd.exe安装 第2步、 打开“Cracked”的文件夹,里面有一个vspdct.dll,如下图:把这个dll粘贴到C:\Program Files (x86)\Eltima Software\Virtual Serial Po…

Python垃圾回收

Python垃圾回收 文章目录 Python垃圾回收引用计数标记清除分代回收 GC作为现代编程语言的自动内存管理机制&#xff0c;专注于两件事&#xff1a; 找到内存中无用的垃圾资源清除这些垃圾并把内存让出来给其他对象使用。 GC彻底把程序员从资源管理的重担中解放出来&#xff0c;让…

MySQL-DML-添加数据insert

目录 添加数据&#xff1a;insert insert语法 注意事项 修改数据&#xff1a;update update语法 注意事项&#xff1a; 删除数据&#xff1a;delete 删除语法 注意事项 总结 DML英文全称Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;…

数据结构---B+Tree

文章目录 BTree简单了解一下BTree MySQL表数据文件MyISAM存储引擎和InnoDB存储引擎的区别&#xff1f; BTree 在我没了解BTree之前&#xff0c;听别人提到这个词时&#xff0c;脑子一片空白&#xff0c;懵懵的&#xff0c;今天利用空闲时间&#xff0c;简单了解了一下BTree&am…

去掉浮夸,空杯心态重新面对测试

刚开始一头扎进软件测试行业&#xff0c;从踏踏实实的机械化功能测试&#xff0c;到学会和甲方扯皮&#xff0c;到被鄙视的五体投地后抓紧修炼表面功夫来忽悠人&#xff0c;学的最多的反而是怎么与人交流。第一次面对跳槽的机会&#xff0c;我竟然发现自己的测试能力不升反降。…

微服务系统面经

微服务架构 秒杀微服务架构图 项目地址可以参考&#xff1a;秒杀系统 1 一个java的微服务系统中有几个网关&#xff1f; 在一个Java的微服务系统中&#xff0c;网关的数量并不固定&#xff0c;这完全取决于系统的设计和需求。网关服务是微服务架构中的重要组件&#xff0c;它…

架构训练营学习笔记:4-4如何设计存储架构?

存储架构设计的三个步骤 分为&#xff1a;1 估算性能需求 2、选择存储系统 3 设计存储方案 性能估算步骤 一 用户量预估 2B的业务&#xff0c;数据量需要预估&#xff0c;2C的需要决策。 方法&#xff1a; 规划&#xff1a;根据成本、预算、目标等确定 推算&#xff1a;基于…

SRA数据下载的一个坑

前两天协助处理GEO数据上的一个单细胞数据&#xff0c;发现了一个巨坑&#xff0c;这里分享下&#xff0c;希望大家能避开。 需要下载的数据集是&#xff0c;GSE119562&#xff0c;查询SRA Run Selector&#xff0c;找到它对应的SRR编号。 于是&#xff0c;我非常熟练的用pref…

【接口自动化测试】HTTP协议详解

协议 简单理解&#xff0c;计算机与计算机之间的通讯语言就叫做协议&#xff0c;不同的计算机之间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则&#xff0c;标准或约定的集合。 OSI模型 1978年国际化标准组织提出了“开放系统互联网…

java实现敏感词过滤,简单实例,dfa算法

java实现敏感词过滤&#xff0c;简单实例&#xff0c;dfa算法 最近在看黑马的视频学习的时候&#xff0c;看到了&#xff0c;自定义敏感词过滤的&#xff0c;感觉蛮有意思的&#xff0c;记录一下。 直接上实例 第一步初始化敏感词&#xff08;可以写死&#xff0c;当然在开发…

Ceres Solver简介及使用

Ceres Solver是一个开源的C库&#xff0c;用于建模和解决大型、复杂的优化问题。它是一个成熟、功能丰富且高性能的库&#xff0c;自2010年以来一直在Google生产中使用。最新发布版本为2.1.0,license为BSD,它支持在Windows、Linux、Mac、Android、iOS上编译&#xff0c;源码地址…

D. Black Cells

Problem - 1821D - Codeforces 思路&#xff1a;我们能够发现题意的区间是不重叠的&#xff0c;并且任意两个区间之间的间隔至少是2&#xff0c;我们会发现一个性质&#xff0c;它一定是从前缀中进行选择的&#xff0c;但是前缀中长度为1的区间可以不选择&#xff0c;因为如果长…

STM32单片机示例:使用定时器触发DMA

文章目录 前言基础说明关键配置与代码示例链接 前言 单片机中使用定时器触发DMA是比较好用的一种操作&#xff0c;这里将对此做个示例说明。 基础说明 ST官方的例程中有一个 TIM_DMA 的例程&#xff0c;其功能是启用一个定时器&#xff0c;设置其中一路通道输出PWM&#xff…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)

360全方位渗透和探究Spring的核心注解开发和实现指南 Spring的注解介绍核心基础注解核心注解分析xml文件的配置configuration的配置 Lazy && ScopeComponentScan添加Controller、Service、Repository注入到spring容器ComponentScan多包扫描的属性排除某些包或者类的扫描…

SpringBoot读取配置的6种方式

1. 概述 通过了解springboot加载配置&#xff0c;可以更方便地封装自定义Starter。 在SpringBoot中&#xff0c;可以使用以下6种方式读取 yml、properties配置&#xff1a; 使用Value注解&#xff1a;读取springboot全局配置文件单个配置。使用Environment接口&#xff1a;通过…

详解c++---异常

目录标题 c语言传统处理错误的方式c异常的使用异常的规则服务器常用的异常继承体系异常安全异常的规范异常的优缺点&#xff1a; c语言传统处理错误的方式 第一种&#xff1a; 程序在运行过程中终止了程序&#xff0c;比如说assert int main() {int i 0;scanf("%d"…