【JavaScript】LeetCode:26-30

news2024/12/22 19:55:11

文章目录

  • 26 矩阵置零
  • 27 螺旋矩阵
  • 28 旋转图像
  • 29 搜索二维矩阵Ⅱ
  • 30 相交链表

26 矩阵置零

在这里插入图片描述

  • 2次双重for循环。
  • 第1次:将matrix[i][j]为0时的i、j分别存放于数组res_i、res_j,记录有哪些行、列应该置为0。
  • 第2次:将记录中的行、列置为0。
/**
 - @param {number[][]} matrix
 - @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function(matrix) {
    var row = matrix.length;
    var col = matrix[0].length;
    var res_i = [];
    var res_j = [];
    for(var i = 0; i < row; i++){
        for(var j = 0; j < col; j++){
            if(matrix[i][j] == 0){
                res_i.push(i);
                res_j.push(j);
            }
        }
    }
    for(var i = 0; i < row; i++){
        for(var j = 0; j < col; j++){
            if(res_i.includes(i) || res_j.includes(j)){
                matrix[i][j] = 0;
            }
        }
    }
    return matrix;
};

27 螺旋矩阵

在这里插入图片描述

  • 创建方向数组dir[[0, 1], [1, 0], [0, -1], [-1, 0]],分别对应“向右”,“向下”,“向左”,“向上”。
  • 创建访问数组vis,记录该元素是否被访问。
  • 当i或j超界,或元素已经被访问时,换方向。
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    var m = matrix.length;
    var n = matrix[0].length;
    var vis = new Array(m).fill(0).map(() => new Array(n).fill(0));
    var dir = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    var count = 1, total = m * n;
    var x = 0, y = 0, d = 0;
    vis[0][0] = 1;
    var res = [];
    res.push(matrix[0][0]);
    while(count < total){
        x_ = x + dir[d][0];
        y_ = y + dir[d][1];
        if(x_ < 0 || x_ >= m || y_ < 0 || y_ >= n || vis[x_][y_] == 1){
            d = (d + 1) % 4
        }
        x = x + dir[d][0];
        y = y + dir[d][1];
        vis[x][y] = 1;
        count++;
        res.push(matrix[x][y]);
    }
    return res;
};

28 旋转图像

在这里插入图片描述

  • 按照规律旋转:
    temp = matrix[i][j];
    matrix[i][j] = matrix[n - 1 - j][i];
    matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
    matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
    matrix[j][n - 1 - i] = temp;
  • 图解如下:
    5    1   9   11  |  5    1   9    11  |  5    1   9   11  |  5    1   9   11
    2    4   8   10  |  2    4   8   10  |  2    4   8   10  |  2    4   8   10
    13  3   6    7   | 13   3   6    7   | 13   3   6    7   | 13   3   6    7
    15 14 12  16  | 15  14 12  16  | 15  14 12  16  | 15  14 12  16
    顺时针旋转,例:temp = 5,15 -> 5,16 -> 15,11 -> 16,temp -> 11。
  • 当n为偶数时,取前n / 2行,前n / 2列元素为起点旋转。
    当n为奇数时,取前n / 2行,前(n + 1) / 2列元素为起点旋转。
    注意:使用Math.floor()向下取整。
    5    1   9   11
    2    4   8   10
    13  3   6    7
    15 14 12  16
    n = 4,取前2行、前2列元素为起点进行旋转。
/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    var n = matrix.length;
    var row = Math.floor(n / 2);
    var col = Math.floor((n + 1) / 2);
    for(var i = 0; i < row; i++){
        for(var j = 0; j < col; j++){
            var temp = matrix[i][j];
            matrix[i][j] = matrix[n - 1 - j][i];
            matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
            matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
            matrix[j][n - 1 - i] = temp;
        }
    }
    return matrix;
};

29 搜索二维矩阵Ⅱ

在这里插入图片描述

  • 从右上角matrix[0][col - 1]开始查找,i:0 ~ row,j:col ~ 0。
  • 当matrix[i][j] = target时,说明已经找到目标值。
    当matrix[i][j] < target时,matrix[i][j]已经为该行的最大值,第i行最大值 < 目标值,说明目标值不在这行,i++。
    当matrix[i][j] > target时,matrix[i][j]已经为该列的最大值,第j列最大值 > 目标值,说明目标值不在这列,j–。
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    var row = matrix.length;
    var col = matrix[0].length;
    var i = 0, j = col - 1;
    while(i < row && j >= 0){
        if(matrix[i][j] == target){
            return true;
        }else if(matrix[i][j] < target){
            i++;
        }else{
            j--;
        }
    }
    return false;
};

30 相交链表

在这里插入图片描述

  • 方法1:哈希集合Set
  • 将链表A的节点全部放入Set中,然后检查Set中是否存在链表B中的节点,若存在,则该节点为相交节点,否则返回null。
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
    var set = new Set();
    while(headA != null){
        set.add(headA);
        headA = headA.next;
    }
    while(headB != null){
        if(set.has(headB)){
            return headB;
        }
        headB = headB.next;
    }
    return null;
};
  • 方法2:链接两个链表
  • (1) A和B长度相同且相交
  • (2) A和B长度不同且相交
    A = a1 -> a2 -> c1 -> c2 -> c3
    B = b1 -> b2 -> b3 -> c1 -> c2 -> c3
    A + B = B + A
    a1 -> a2 -> c1 -> c2 -> c3 -> b1 -> b2 -> b3 -> c1 -> c2 -> c3 =
    b1 -> b2 -> b3 -> c1 -> c2 -> c3 -> a1 -> a2 -> c1 -> c2 -> c3
  • (3) A和B不相交
  • 若链表A遍历到最后一个节点了,则将其链接到链表B的头节点;若链表B遍历到最后一个节点了,则将其链接到链表A的头节点。
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
    var a = headA;
    var b = headB;
    while(a != b){
        if(a != null){
            a = a.next;
        }else{
            a = headB;
        }
        if(b != null){
            b = b.next;
        }else{
            b = headA;
        }
    }
    return a;
};

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

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

相关文章

揭秘蛇形机器人的主动SLAM算法和障碍物避让策略

更多优质内容&#xff0c;请关注公众号&#xff1a;智驾机器人技术前线 1.论文信息 论文标题&#xff1a;An active SLAM with multi-sensor fusion for snake robots based on deep reinforcement learning 作者&#xff1a;Xin Liu, Shuhuan Wen, Yaohua Hu, Fei Han, Hong…

如何利用免费工具轻松设计出专业Logo?

Logo 作为品牌的象征和视觉核心&#xff0c;承载了品牌的价值和理念。无论是创业公司还是个人品牌&#xff0c;拥有一个独特的 Logo 都显得尤为重要。然而&#xff0c;设计一个专业的 Logo 通常需要高昂的设计费用&#xff0c;许多人因此望而却步。幸运的是&#xff0c;随着互联…

视频合并实用教程分享,教你6个合并视频方法,不可错过!

多个视频怎么合成一个视频&#xff1f;如何把2个视频合成一个&#xff1f;怎么把多个视频合成一个视频&#xff1f;您是否也曾产生过这样的疑问呢&#xff1f;在如今互联网高速发展的时代&#xff0c;各行各业都难免需要涉及到视频制作领域&#xff0c;如果您正在考虑视频如何有…

HarmonyOS开发之模拟器地图点击无效问题

问题描述 当我们模拟器已经运行了&#xff0c;但是需求中需要引用地图&#xff0c;地图的点击事件无效&#xff0c;模拟器地图点击事件以及地拖拖拽无效&#xff0c;这个时候需要配置一下通过 chrome://inspect/#devices 通常用于远程调试移动设备上的 Chrome 浏览器 1、先配…

Cortex-A7:ARM官方推荐的嵌套中断实现机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版 1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断&#xff0c;开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中&#xff0c;硬件原生是不支持嵌套中断的&#xff0c;这从Cortex-A…

Sentinel实时监控不展示问题

问题 官方插件 Endpoint 支持&#xff0c;可以实时统计出SpringBoot的健康状况和请求的调用信息 在使用 Endpoint 特性之前需要在 Maven 中添加 spring-boot-starter-actuator 依赖&#xff0c;并在配置中允许 Endpoints 的访问。 Spring Boot 1.x 中添加配置 management.se…

硬件工程师笔试面试——MOS管

目录 8、MOS管 8.1 基础 MOS管原理图 MOS实物图 8.1.1 概念 8.1.2 特点 8.1.3 类型 7.2 相关问题 7.2.1 MOS管在不同应用中的阈值电压和最大漏极电流通常是多少? 7.2.2 如何根据电路设计选择合适的MOS管类型? 7.2.3 MOS管在高频应用中的优势是什么,它如何影响电路…

数据结构(4)栈和队列

一、栈 栈是一种线性的数据存储结构&#xff0c;由于栈只允许从一端进行数据的插入和删除。因此&#xff0c;栈是先进后出&#xff08;FILO&#xff09;的特性。 系统栈是由系统进行创建和维护的&#xff0c;数据结构中的栈是由自己创建和维护的。 栈的类型有&#xff1a;满增栈…

网络基础入门指南(三)

一、远程管理交换机 1.配置IP地址 远程管理需要通过IP地址访问网络设备交换机的接口&#xff0c;默认无法配置IP地址需要使用虚接口vlan1 2.配置远程登录密码 远程管理需要配置VTY接口VTY是虚拟终端&#xff0c;是一种网络设备远程连接的方式vty 0 4表示可同时打开5个会话 3…

数控纵切自动车床

数控纵切自动车床&#xff0c;作为现代机械加工领域的重要设备&#xff0c;集成了高精度、高效率与自动化等诸多优势。下面&#xff0c;我将从多个方面为您详细介绍这一先进设备。 ‌一、设备概述‌ 数控纵切自动车床&#xff0c;顾名思义&#xff0c;是一种结合了数控技术与纵…

vscode clang-format 格式化

系列文章目录 文章目录 系列文章目录vscode clang-formatOverview1.安装 clang-format2.设置格式化配置文件3.格式化配置文件示例关于作者 vscode clang-format Overview 项目统一格式化clang-formatvscode 1.安装 clang-format 1.vscode中&#xff0c;进行以下操作&#…

C++(二)----类和对象

一、前言 众所周知&#xff0c;C与C语言不同的地方就是&#xff0c;C引入了类和对象&#xff0c;可以在兼容C语言的同时面向对象编程&#xff0c;同时具备了封装、继承、多态三种特点&#xff08;划重点&#xff09;。面向对象可以说是C最重要的部分了&#xff0c;而类和对象就…

AnyChart 数据可视化框架

AnyChart 数据可视化框架 AnyChart 是一个灵活的 JavaScript&#xff08;HTML5、SVG、VML&#xff09;图表框架&#xff0c;适合任何需要数据可视化的解决方案。 目录 下载并安装开始插件将 AnyChart 与 TypeScript 结合使用将 AnyChart 与 ECMAScript 6 结合使用技术集成贡献…

区块链学习笔记1--比特币

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。 从狭义上来说&#xff1a;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构&#xff0c;并以密码学的方式保证的不可篡改和不可伪造的分布式账本。 意思就是…

Zabbix自定义监控项与触发器

当我们需要获取某台主机上的数据时&#xff0c;直接利用 zabbix 提供的模板可以很方便的获得需要的数据,但是有些特别的数据&#xff0c;利用这些现有的模板或监控项是无法实现的&#xff0c;例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控…

上门家政做饭系统小程序开发概览

上门做饭系统是一种融合了现代科技手段的创新餐饮服务模式&#xff0c;旨在为用户提供便捷且个性化的上门烹饪体验。通过互联网技术&#xff0c;这一系统连接了专业的私人厨师与有需求的家庭或个人&#xff0c;让高品质的餐饮服务更加触手可及。编辑&#xff1a;qawsed2466 核心…

【C++】优先级队列反向迭代器的实现

一、优先级队列&#xff1a; 优先级队列&#xff08;priority queue&#xff09;是一种容器适配器&#xff0c; 它默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;…

Rust 助力无服务器构筑云计算新引擎

引言 今年 Amazon Lambda 迎来了它的第一个十周年。在过去的十年里&#xff0c;无服务器架构改变了软件开发的方式&#xff0c;简化了应用程序的部署和扩展&#xff0c;成为云计算的新引擎。而在众多支持无服务器技术的编程语言中&#xff0c;Rust 以其卓越的安全性和高性能成…

项目管理工作流是什么?项目管理工作流管理实战技巧!

项目管理工作流是指在协作过程中通过限制任务状态的流转进行流程控制的一种方式。项目从启动到完成所经历的一系列有序、可控的步骤和流程&#xff0c;它详细描述了项目执行过程中各项任务和活动的顺序、依赖关系、责任人以及完成标准等&#xff0c;是项目成功执行的重要保障。…

java设计模式 桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在将抽象部分与其实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式通过将继承改为组合&#xff0c;实现了在不修改现有类的情况下&#xff0c;动态地切换和扩展抽象类与其具体实现…