【LeetCode】数组-5(566)-按照要求输出矩阵

题目要求:

思路一:借助队列,先顺序读入input矩阵,然后按照output要求向output矩阵输入

【正确代码】

 1 class Solution {
 2     public int[][] matrixReshape(int[][] nums, int r, int c) {
 3         int[][] res = new int[r][c];
 4         if (nums == null || nums.length * nums[0].length != r * c) {
 5             return nums;
 6         }
 7         Queue<Integer> queue = new LinkedList<>();
 8         for (int i = 0; i < nums.length; i++) {
 9             for (int j = 0; j < nums[0].length; j++) {
10                 queue.add(nums[i][j]);
11             }
12         }
13         for (int i = 0; i < r; i++) {
14             for (int j = 0; j < c; j++) {
15                 res[i][j] = queue.remove();
16             }
17         }
18         return res;
19     }
20 }

时间复杂度:O(m*n)

空间复杂度:O(m*n)

思路二:不借助辅助空间,直接根据output的要求向output矩阵输入

正常向output矩阵中读入数据,如果 cols > c 的话,rows++

【正确代码】(蓝色标记处,第一次写时出错)

 1 class Solution {
 2     public int[][] matrixReshape(int[][] nums, int r, int c) {
 3         int[][] res = new int[r][c];
 4         if (nums == null || nums.length * nums[0].length != r * c) {
 5             return nums;
 6         }
 7         int rows = 0, cols = 0;
 8         for (int i = 0; i < nums.length; i++) {
 9             for (int j = 0; j < nums[0].length; j++) {
10                 res[rows][cols] = nums[i][j];
11                 cols++;
12                 if (cols >= c) {
13                     rows++;
14                     cols = 0;
15                 }
16             }
17         }
18         return res;
19     }
20 }

时间复杂度:O(m*n)

空间复杂度;O(m*n)

思路三:使用矩阵转换的公式 nums[n?i+j]

满足基本的 nums.length * nums[0].length == r * c 条件情况下,使用矩阵目前的 (长度/c )决定行数,(长度 % c)决定列数

【正确代码】(今天什么状态,刚刚又把count++给丢了「囧」)

 1 class Solution {
 2     public int[][] matrixReshape(int[][] nums, int r, int c) {
 3         int[][] res = new int[r][c];
 4         if (nums == null || nums.length * nums[0].length != r * c) {
 5             return nums;
 6         }
 7         int count = 0;
 8         for (int i = 0; i < nums.length; i++) {
 9             for (int j = 0; j < nums[0].length; j++) {
10                 res[count / c][count % c] = nums[i][j];
11                 count++;
12             }
13         }
14         return res;
15     }
16 }

时间复杂度:O(m*n)

空间复杂度:O(m*n)

时间: 2024-12-16 18:06:43

【LeetCode】数组-5(566)-按照要求输出矩阵的相关文章

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix/ 3.题目内容 英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素. 例如:现有矩阵如下: [  [ 1,

Leetcode数组题*3

目录 Leetcode数组题*3 66.加一 题目描述 思路分析 88.合并两个有序数组 题目描述 思路分析 167.两数之和Ⅱ-输入有序数组 题目描述 思路分析 Leetcode数组题*3 66.加一 题目描述 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123. 链接:ht

code第一部分数组:第十五题 矩阵翻转(图像翻转)

code第一部分数组:第十五题 矩阵翻转(图像翻转) 首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢.如下图,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次. 源代码 #include <iostream> #include <vector> using namespace std; //引用类型形参 void swap(int &n,int &m) { int temp=n; n=m; m=temp; } //指针类型形参 void swap1(int

编程题:将数字0~5放入一个整型数组,并逆序输出数组

#include<stdio.h> void main() { int i,a[5]; for(i=0;i<5;i++)         /*给数组中元素赋值*/ a[i]=i; for(i=4;i>=0;i--)          /*逆序输出数组中元素值*/ printf("%3d",a[i]); printf("\n"); } 编程题:将数字0~5放入一个整型数组,并逆序输出数组,布布扣,bubuko.com

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

matlab fprintf输出矩阵

a=[1,2,3;4,5,6]  是一个2×3矩阵1 2 34 5 6 fid=fopen('d:\chr.txt','wt')  本命令用法网上可以查到,帮助文件里讲的也很清楚 fprintf(fid,'%8.4f %8.3f %6.2f\n',a')     输出矩阵 fclose(fid)   关闭文件 讲一下fprintf命令中每一项的含义: fid    函数句柄,代表之前打开的文件'%8.4f %8.3f %6.2f\n'      输出格式,具体如下:        1.%8.4f

[经典面试题]输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。

[题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1. [分析] 这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组的特性,我们应该能找到更好的解法. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面

【c语言】输入一个递增排序的数组的一个旋转,输出旋转数组中的最小元素

//旋转数组的最小数字 //题目:把一个数组最開始的若干个元素搬到数组的末尾.我们称之为数组的旋转. //输入一个递增排序的数组的一个旋转.输出旋转数组中的最小元素. //比如:数组{3.4,5,1,2}为{1,2.3.4.5}的一个旋转,最小元素是1. #include <stdio.h> #include <assert.h> int min_equ(int *src, int left, int right) { int i = 0; int ret = src[left];

【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素

//求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素 #include <stdio.h> #include <string.h> int find_min(int arr[],int len) { int i = 0; for (i = 1; i < len; i++) { if (arr[i] < arr[0]) return arr[i]; } return arr[0]; } int main() { int i; int arr1[] =