当前位置: 首页 > article >正文

【JavaScript】LeetCode:26-30

文章目录

  • 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.kler.cn/a/300617.html

相关文章:

  • 探索与创作:2024年CSDN平台上的成长与突破
  • SQL刷题快速入门(二)
  • Linux使用SSH连接GitHub指南
  • Qt之文件系统操作和读写
  • C语言进阶习题【1】指针和数组(3)——一维指针指向字符数组首元素地址
  • Python自动化测试中定位隐藏菜单元素的策略
  • CV、NLP、数据控掘推荐、量化
  • Redis 多线程模型详解
  • EmguCV学习笔记 VB.Net 11.4 图像分类
  • 如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程(包括理论介绍和实践示例)
  • FPGA设计-使用MicroBlaze的Boot Loader的注意事项
  • Leetcode3271. 哈希分割字符串
  • 论文阅读:RGBD GS-ICP SLAM
  • 【题解】CF2008G
  • 解锁数据的秘密武器:PCA带你走进降维新世界
  • 《黑神话:悟空》被“罕见”网络攻击联想个人网络和数据安全防范
  • Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密
  • AIGC大模型扩图:Sanster/IOPaint(4)
  • 大模型岗位招聘数据分析及可视化
  • 免费爬虫软件“HyperlinkCollector超链采集器v0.1”
  • Day8 | Java框架 | Maven
  • 【EI稳定,马来亚大学主办】2024年计算机与信息安全国际会议(WCCIS 2024,9月27-29)
  • Mac M芯片上安装统信UOS 1070arm64虚拟机
  • React实现虚拟列表的优秀库介绍
  • pyecharts可视化数据大屏【详细教程】
  • Flutter之SystemChrome全局设置