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

目录

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,哪一些没有0int[] 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列的数据都要为0b[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.rhkb.cn/news/102536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25岁无经验入行软件测试的感悟,写给还在迷茫中的你

转行软件测试两年了&#xff0c;这两年来&#xff0c;从刚开始对测试认识的朦朦胧胧&#xff0c;现在思路也逐渐清晰了&#xff0c;也明确了自己的发展方向。虽然对那些测试理论和测试工具以及测试技术有了一些加强&#xff0c;但是自我感觉还是不够深入。 我一直希望能真正融…

《网络是怎样连接的》(四)

本文主要取材于 《网络是怎样连接的》 第四章。 目录 4.1 互联网的基本结构 4.2光纤接入网&#xff08;FTTH&#xff09; 4.3 接入网中使用的PPP和隧道 4.4 网络运营商的内部 4.5 跨越运营商的网络包 简述&#xff1a;本文主要内容是解释 网络包是如何通过互联网接入路由…

【0823作业】C++:实现类嵌套,以及其构造函数、析构函数和拷贝构造函数

要求&#xff1a; 设计一个Per类。类中包含私有成员&#xff1a;姓名、年龄、指针成员身高、体重&#xff1b; 再设计一个Stu类&#xff0c;类中包含私有成员&#xff1a;成绩、Per类对象 p1&#xff1b; 设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostr…

【广州华锐视点】AR配电所巡检系统:可视化巡检利器

随着科技的发展&#xff0c;人工智能、大数据等技术逐渐应用于各个领域&#xff0c;为人们的生活带来便利。在电力行业&#xff0c;AR(增强现实)技术的应用也日益广泛。AR配电所巡检系统作为一种新型的巡检方式&#xff0c;可以实现多种功能&#xff0c;提高巡检效率&#xff0…

如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Android类加载机制

要说Android的类加载机制 &#xff0c;就离不开 类加载器ClassLoader&#xff0c;它是一个抽象接口 下面这个图还是比较好表达了类加载流程&#xff0c;但如果不看我红色画的线&#xff0c;就会感觉有点乱&#xff0c;需要注意是采用的是双亲委派模式&#xff0c;class加载要先…

测试驱动开发(TDD)

测试驱动开发&#xff08;TDD&#xff09; 本篇文章简单叙述一下什么是测试驱动开发&#xff0c;以及怎么进行测试驱动开发&#xff01; TDD &#xff08;Test Driven Development&#xff09;&#xff1a;&#xff08;源于极限编程&#xff08;XP&#xff09;&#xff09;在不…

9.Sentinel哨兵

1.Sentinel Sentinel&#xff08;哨兵&#xff09;是由阿里开源的一款流量控制和熔断降级框架&#xff0c;用于保护分布式系统中的应用免受流量涌入、超载和故障的影响。它可以作为微服务架构中的一部分&#xff0c;用于保护服务不被异常流量冲垮&#xff0c;从而提高系统的稳定…

JavaSE 数组

定义&#xff1a; int []arr; int arr[]; 初始化 // 完整格式 int arr[] new int[]{1, 2, 3}; // 简单格式 int arr[] {1, 2, 3}; 数组的元素访问、遍历 按照下标访问即可。数组的长度函数为 arr.length()。idea快速生成遍历的方法&#xff1a;数组名.fori 静态初始化 &a…

element时间选择器el-date-picter使用disabledDate指定禁用的日期

需要的效果 <el-date-pickerclass"selectstyle"v-model"year"value-format"yyyy"type"year":picker-options"disabledCli"placeholder"选择年"> </el-date-picker>data() {return {disabledCli: {/…

5G+AI数字化智能工厂建设解决方案PPT

导读&#xff1a;原文《5GAI数字化智能工厂建设解决方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。数字化智能工厂定义 智能基础架构协同框架 - 端、边、云、网…

微信小程序手机号验证开发遇到问题

公司小程序项目中快速登录需要实现微信用户授权手机登录、注册功能。结果遇到了 invalid code hint: [zHkDmt0sf-MBjga] rid: 64e3259f-1091b953-7e10f1da 目录 服务端文档 文档描述 返回信息 服务端代码 遇到问题 排查问题 1.服务端用错了appid serect 2.小程序端用错…

C++(Qt)软件调试---gdb调试入门用法(12)

gdb调试—入门用法&#xff08;1&#xff09; 文章目录 gdb调试---入门用法&#xff08;1&#xff09;1、前言1.1 什么是GDB1.2 为什么要学习GDB1.3 主要内容1.4 GDB资料 2、C/C开发调试环境准备3、gdb启动调试1.1 启动调试并传入参数1.2 附加到进程1.3 过程执行1.4 退出调试 4…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例&#xff1a; 数据流的读取 一层一层的包装&#xff0c;进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

vue3+elementPlus table里添加输入框并提交校验

<template><div><el-form :model"info" ref"forms"><el-tableref"tableRef":data"info.data"border><el-table-column align"center" property"name" label"*姓名"><…

springboot整合rabbitmq

添加依赖 <!--RabbitMQ 依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…

DFX概述 | Design For X | Design For Excellent

Design for X (DFX) Methods 什么是“Design for X”&#xff1f; Design for eXcellence是一种在设计和制造领域中的不断发展的原则哲学。它采用了全面和系统的设计方法&#xff0c;关注产品的各个方面——从概念生成到最终交付。 它提供了良好的实践和设计指南&#xff0c…

【RHEL】硬盘分区与格式化

fdisk命令 在linux中&#xff0c;fdisk是基于菜单的命令。对硬盘分区时&#xff0c;可以在fdisk命令后面直接加上要分区的硬盘作为参数(分区工具) 利用如下所示命令&#xff0c;打开fdisk操作菜单。 输入p,查看当前分区表。从命令执行结果可以到&#xff0c;/dev/mapper/rhel…

Python入门【原生字符串、边界字符、search函数、re模块中其他常用的函数 、贪婪模式和非贪婪模式、择一匹配(|)的使用、分组】(三十)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

文章目录 前言什么是二分查找算法1.二分查找1.1 题目要求1.2 做题思路1.3 Java代码实现 2.在排序数组中查找元素的第一个和最后一个位置2.1 题目要求2.2 做题思路2.3 Java代码实现 3.搜索插入位置3.1 题目要求3.2 做题思路3.3 Java代码实现 4.x的平方根4.1 题目要求4.2 做题思路…