【LeetCode-经典面试150题-day9]

news2024/12/23 4:37:39

目录

36.有效的数独

54.螺旋矩阵

 48.旋转图像

 73.矩阵置零



36.有效的数独

题意:

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 空白格用 '.' 表示。

【输入样例】

board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]

【输出样例】true

解题思路:

1. 按行和按列都比较简单,用一个二维数组a[i][num]来存储第i行/列中num出现的次数,num的取值范围是1~9;

2. 每个3×3的小九宫格,用三维数组来实现,matrix[i][j][num]表示的是三维数组中,第i行第j列这个九宫格中,num出现的次数。

3.观察九个小九宫格的坐标关系,最左上角的小九宫格的行列坐标范围是(0~2,0~2),如果将其除3,则坐标是(0,0),第二个九宫格(横着看)的坐标是(0~2,3~5),除3得到的结果是(0,1),因此,通过对行范围和列范围同时除3,可以将每个小九宫格在三维数组matrix中的坐标定下来(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)

4. ok,开始枚举,每次找到一个非"."的字符,就将其添加到三个统计数组中,添加完后要判断,加进去之后得到的a[i][num]的值会不会大于1,大于1表示不符合规律,列也一致。

class Solution {
    public boolean isValidSudoku(char[][] board) {
        int[][] row = new int[10][9];//行row[i][num]:第i行num值有多少个
        int[][] col = new int[10][9];//列
        int[][][] matrix = new int[10][10][9];//小矩阵

        for(int i=0;i<9;++i){
            for(int j=0;j<9;++j){
                //先填充行的矩阵
                char temp = board[i][j];
                if(temp!='.'){
                    int num = temp - '0'-1;
                    ++row[i][num];
                    ++col[j][num];
                    ++matrix[i/3][j/3][num];
                    if(row[i][num]>1||col[j][num]>1||matrix[i/3][j/3][num]>1){
                        return false;
                    }
                }

            }
        }
        return true;
    }
}

时间: 击败了18.26%

内存: 击败了5.14%

54.螺旋矩阵

题意:

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

【输入样例】

matrix=[[1,2,3],[4,5,6],[7,8,9]]

【输出样例】[1,2,3,6,9,8,7,4,5]

解题思路:

1. 首先,要有一个对应的标记矩阵isChoose[i][j],0表示matrix[i][j]中的值还没有遍历过;

2.定义行列访问指针i,j;根据题目规律,矩阵访问规律是:向右走-->向下走-->向左走-->向上走-->向右走

3. 定义变量count,用于统计已经访问多少数字了,方便结束循环;

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //在有些题中也叫做蛇形矩阵
        int m =matrix.length;//m行
        int n = matrix[0].length;//n列
        List<Integer> ans = new ArrayList<>();
        if(matrix == null || m == 0 || n== 0){
            return ans;
        }
        int i=0,j=0;
        int[][] isChoose = new int[m][n];
        isChoose[0][0] = 1;//从第一位开始,第一位先走
        ans.add(matrix[0][0]);
        int count =  1;
        while(count < m*n){
            //向右走,是列在变化,行不变
            while(j+1 < n && isChoose[i][j+1] == 0){
                //下一位没有越界,并且没有被访问过的时候,可以进行访问
                ans.add(matrix[i][j+1]);
                isChoose[i][j+1] = 1;
                //统计个数
                ++count;
                ++j;
            }
            //向下走,行在变化
            while(i+1 < m && isChoose[i+1][j] == 0){
                //下一位没有越界,并且没有被访问过的时候,可以进行访问
                ans.add(matrix[i+1][j]);
                isChoose[i+1][j] = 1;
                //统计个数
                ++count;
                ++i;
            }
            //向左走
            while(j-1 >= 0 && isChoose[i][j-1] == 0){
                //下一位没有越界,并且没有被访问过的时候,可以进行访问
                ans.add(matrix[i][j-1]);
                isChoose[i][j-1] = 1;
                //统计个数
                ++count;
                --j;
            }
            //向上走
            while(i-1>= 0 && isChoose[i-1][j] == 0){
                ans.add(matrix[i-1][j]);
                isChoose[i-1][j] =1;
                ++count;
                --i;
            }
        }
        return ans;
    }
}

时间: 击败了100.00%

内存: 击败了66.09% 

 48.旋转图像

题意:

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

【输入样例】

matrix=[[1,2,3],[4,5,6],[7,8,9]

【输出样例】

[[7,4,1],[8,5,2],[9,6,3]

解题思路:

1. 找规律,第一行的第j个元素翻转后在倒数第一列的第j个元素;第二行的第j个元素翻转后在倒数第二列的第j个元素;

2. 以i表示行号,j表示列号,规律是:(i,j)-->(j,n-1-i)

3. 就是进行替换,替换这里因为要原地翻转数组,想到了之前练习过的轮转数组。ok尝试一下。

4. 这边跟轮转数组的区别是,一个二维数组,轮转了4次之后就会形成一个环。

 5.循环次数

        每一轮置换,可以将4个元素放在指定位置,因此,n*n个元素一共需要n*n/4次置换。

        那行跟列怎么知道是遍历多少次呢?

嘿嘿,被分成了4等分,意味着我们行遍历n/2次,列遍历n/2次就够了,考虑到n为单数时,中间会多出来一列,此时列要遍历(n+1)/2,即保证向上取整。 

class Solution {
    public void rotate(int[][] matrix) {
        int temp;//存储临时元素
        int n = matrix.length;
        for(int i=0;i<n/2;++i){
            for(int j= 0;j< (n+1)/2; ++j){
                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;
            }
        }
    }
}

时间: 击败了100.00%

内存: 击败了31.83% 

 73.矩阵置零

题意:

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

【输入样例】

matrix=[[1,1,1],[1,0,1],[1,1,1]]

【输出样例】[[1,0,1],[0,0,0],[1,0,1]]

解题思路:

拿到题目的时候就想到一个很简单粗暴的方法;

定义两个数组a[i]和b[j],分别用来判断第i行和第j列是否有为0的元素;

遍历元素,对数组a和b进行赋值

再遍历数组,修改元素

class Solution {
    public void setZeroes(int[][] matrix) {
        //两个数组a和b,用来判断那一些列有0,哪一些没有0
        int[] a = new int[matrix.length];//行
        int[] b = new int[matrix[0].length];//列
        for(int i=0;i<matrix.length;++i){
            for(int j=0;j<matrix[0].length;++j){
                if(matrix[i][j] == 0){
                    a[i] = 1;//所有i行,j列的数据都要为0
                    b[j] = 1;
                }
            }
        }
        for(int i=0;i<matrix.length;++i){
            if(a[i] == 1){
                for(int j=0;j<matrix[0].length;++j){
                  matrix[i][j] =0;
                }
            }
        }
        for(int j=0;j<matrix[0].length;++j){
            if(b[j] == 1){
                for(int i=0;i<matrix.length;++i){
                  matrix[i][j] =0;
                }
            }
        }
    }
}

时间: 击败了100.00%,我这双重循环还能100%,没有想到哈哈

内存: 击败了59.17% 

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

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

相关文章

huggingface datasets离线加载文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Sim/circuit10

通过观察可知&#xff0c;在a、b同时为0或1时&#xff0c;state的值改变 state的值可以改变q的输出&#xff0c;1为ab的同或&#xff0c;0为异或 利用assign q进行输出 module top_module (input clk,input a,input b,output q,output state );always(posedge clk)if(a&…

【TypeScript】元组

元组&#xff08;Tuple&#xff09;是 TypeScript 中的一种特殊数据类型&#xff0c;它允许你定义一个固定数量和类型的元素组合。元组可以包含不同类型的数据&#xff0c;每个数据的类型在元组中都是固定的。以下是 TypeScript 中元组的基本用法和特点&#xff1a; // 声明一…

Win系统下安装Linux双系统教程

软件下载 软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①丨百度网盘&#xff1a;1.ubuntu18.0.4下载链接&#xf…

量子计算对信息安全的影响:探讨量子计算技术对现有加密方法和信息安全基础设施可能带来的颠覆性影响,以及应对策略

第一章&#xff1a;引言 随着科技的迅猛发展&#xff0c;量子计算作为一项颠覆性的技术正逐渐走入我们的视野。量子计算以其强大的计算能力引发了全球科技界的广泛关注。然而&#xff0c;正如硬币的两面&#xff0c;量子计算技术所带来的不仅仅是计算能力的巨大飞跃&#xff0…

公文校对的艺术:如何确保你的正式文件零错误?

公文是政府和企业中最重要的正式文件之一。一个小小的错误&#xff0c;不仅会影响公文的专业性&#xff0c;甚至可能带来法律和经济后果。因此&#xff0c;如何进行精准的公文校对成为了一门必不可少的技能。接下来&#xff0c;我们将分享一些专业的公文校对技巧&#xff0c;并…

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中&#xff0c;但如果写在类中&#xff0c;类名需要是Test开头&#xff0c;非Test开头的类下的test_方法不会被搜集为用…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 &#xff1a;[https://www.zhihu.com/question/22031360/answer/3073452…

HCIP---VLAN实验(接入、中继、混杂)

实验要求 PC1/3的接口均为access模式&#xff0c;且属于van2&#xff0c;在同一网段 PC2/4/5/6的IP地址在同一网段&#xff0c;与PC1/3不在同一网段 PC2可以访问4/5/6&#xff0c;PC4不能访问5/6&#xff0c;PC5不能访问PC6 所有PC通过DHCP获取ip地址&#xff0c;PC1/3可以访问…

XXX程序 详细说明

用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明&#xff08;文件说明.txt&#xff09;&#xff0c;该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件&#xff0c;然后提取其中某些需要的数据&…

Python爬虫(十四)_BeautifulSoup4 解析器

CSS选择器&#xff1a;BeautifulSoup4 和lxml一样&#xff0c;Beautiful Soup也是一个HTML/XML的解析器&#xff0c;主要的功能也是如何解析和提取HTML/XML数据。 lxml只会局部遍历&#xff0c;而Beautiful Soup是基于HTML DOM的&#xff0c;会载入整个文档&#xff0c;解析整…

智能硬件知识

第二章 第五章 第六章 第七章 第八章 第九章 第十章 考点 条件编译 volatile、static、 union、 struct、 const指针 堆与栈的不同点 3.功能模块应用题 (1) GPIO 的应用:流水灯的电路及软件编码、驱动数码管的电路及编码。 (2)外部中断的应用:电路及回调函数编码。 (3) …

关于数据中心存储智能运维的思考

随着互联网和大数据的快速发展&#xff0c;数据中心存储的重要性也日益凸显。在本文中&#xff0c;将深入探讨数据中心存储智能运维的历史变迁、当前的发展状态和未来的运维趋势。 数据中心存储运维的历史变迁可以分为以下几个阶段&#xff1a; 人工运维阶段 最初&#xff0c…

深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播)、深度学习面试

1、MLP、FCN、DNN三者的关系&#xff1f; 多层感知器MLP&#xff0c;全连接网络&#xff0c;DNN三者的关系&#xff1f;三者是不是同一个概念&#xff1f; FCN&#xff1a;Fully Connected Neural Network&#xff0c;全连接神经网络&#xff0c;也称为密集连接神经网络&#…

前端开发怎么解决前端安全性的问题? - 易智编译EaseEditing

前端安全性是保护前端应用程序免受恶意攻击和数据泄露的重要方面。以下是一些解决前端安全性问题的关键方法&#xff1a; 输入验证与过滤&#xff1a; 对所有用户输入进行验证和过滤&#xff0c;防止恶意用户通过注入攻击等手段破坏应用程序或获取敏感信息。 跨站点脚本&#…

Android笔记:在原生App中嵌入Flutter

首先有一个可以运行的原生项目 第一步&#xff1a;新建Flutter module Terminal进入到项目根目录&#xff0c;执行flutter create -t module ‘module名字’例如&#xff1a;flutter create -t module flutter-native 执行完毕&#xff0c;就会发现项目目录下生成了一个modu…

【核磁共振成像】单射成像和高速脉冲序列

目录 一、提高成像速度的手段二、平面回波成像(EPI)序列三、常用或基本EPI序列四、EPI变型序列五、渐开平面螺旋(spiral)扫描序列六、RARE序列七、GRASE序列八、STEAM序列 一、提高成像速度的手段 MRI扫描时间可表示为   其中Nex为激发次数&#xff0c;NpE1和NpE2是两个相位…

kubernetes--技术文档-真--集群搭建-三台服务器一主二从(非高可用)附属文档-使用不同运行商服务器-搭建公网集群

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;版本&#xff01;&#xff01;&#xff01;&#xff01; 使用公网初始化 Kubernetes 需要 Kubernetes 版本 1.19 或更高版本。在早期的版本中&#xff0c;Kubernetes 还不支持公网初始化。因此&#xff0c;请确保…

【C++】visualstudio环境安装

记录了部分安装步骤&#xff0c;可能有点不全&#xff0c;参考下&#xff0c;需要的磁盘空间差不多20GB&#xff1b; 下载 https://visualstudio.microsoft.com/zh-hans/vs/ 下载完成&#xff1a; 双击进入安装状态&#xff1a; 根据自己的需求勾选安装项&#xff1a; 选择…

RNN+LSTM正弦sin信号预测 完整代码数据视频教程

视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…