文档讲解:代码随想录
状态:有点难度
59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
视频:
《代码随想录》算法视频公开课 (opens new window):拿下螺旋矩阵!LeetCode:59.螺旋矩阵II
思路:
该题没有复杂的算法,但可能有一点理解上的难度:
该过程可以理解为每行和每列都是几个元素加拐点,这样就可以套用for循环将前几个元素为一个块,拐点为下一个块的起点;
当完成了一圈,则记录将每行每列的拐点数加1(为单向的,即每次循环只会被终点的那一侧影响)
如果为奇数会多出来一个点,可以最后添加。
代码如下:
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix=new int[n][n];
int guaidian=1;//拐点
int x=0;//起点x轴
int y=0;//起点y轴
int loop=1;//圈数
int num=1;//矩阵中的数字
while(loop<=n/2){
int i=x;
int j=y;//这两个要放置在while内部
for(;j<n-guaidian;j++){
matrix[i][j]=num;
num++;
}
for(;i<n-guaidian;i++){
matrix[i][j]=num;
num++;
}
for(;j>y;j--){
matrix[i][j]=num;
num++;
}
for(;i>x;i--){
matrix[i][j]=num;
num++;
}
x++;
y++;
guaidian++;
loop++;
}
if (n % 2 == 1) { // n 为奇数时,单独处理矩阵中心的值
matrix[x][y] = num;
}
return matrix;
}
}
注意:i和j要放到whlie内,否则如下:
58. 区间和
本题为代码随想录后续扩充题目,还没有视频讲解,顺便让大家练习一下ACM输入输出模式(笔试面试必备)
题目描述
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。
输出描述
输出每个指定区间内元素的总和。
输入示例
5
1
2
3
4
5
0 1
1 3
输出示例
3
9
数据范围:
0 < n <= 100000
思路 前缀和的思想
首先定义Array和sum两个数组,
Array是将输入的数字记录的数组;
sum是将输入的数累加的数组。
以下为原理
p[1] = sum[0] + sum[1];
p[5] = sum[0] + sum[1] + sum[2] + sum[3] + sum[4] + sum[5];
p[5] - p[1] = sum[2] + sum[3] + sum[4] + sum[5];
通过这个方法可以将所有的数字加到一起,等到使用的时候就可以将sum的第b个数字(第一个数加到b的和)减去sum的第(a-1)个(左闭右闭),
如果是第一个则可以直接取sum的第b个数字
这样可以大量减少运行时间
【注:以下俩个复杂程度刚学,如果有错欢迎纠正。】
时间复杂程度: O(n^2)减少到O(n).
空间复杂程度:O(n)
程序中使用的主要额外空间有:
int[] Array = new int[n];
:一个整型数组,用于存储输入的序列,其大小与输入n
成正比。int[] sum
= new int[n];
:另一个整型数组,用于存储前缀和,其大小同样与输入n
成正比。- 几个整型变量(如
a
,b
,sum
等),这些变量不随输入大小n
的增加而显著增加空间使用,因此可以视为常数空间。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] Array=new int[n];
int[] sum=new int[n];
int sum_num=0;
for(int i=0;i<n;i++){
Array[i]=scanner.nextInt();
sum_num+=Array[i];
sum[i]=sum_num;
}
while (scanner.hasNextInt()) {
int a=scanner.nextInt();
int b=scanner.nextInt();
int num=0;
if(a==0){
num=sum[b];
}
else{
num=sum[b]-sum[a-1];
}
System.out.println(num);
}
}
}
欢迎各位大佬纠正。
如果有问题可以在评论区讨论。
引用:代码随想录