给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。

示例:

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

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

解释:
思路,
说明:

给定矩阵中的元素总数不会超过 100000 。
上图,如
1 2 3
4 5 6
7 8 9
我们以对角线作为线索借助二维数组存储对角线,处理对角线,换成一维数组。
对角线的序列也就是二维数组的第一个下标numbers[i][],
我们先不考虑取对角线的方向,放在取完以后再分奇偶倒置。
我们的重点在于
1.对角线个数:我找的规律是行×列-1,想到这的同时我也想到了1×6这种情况
所以在代码中我将这两种情况区分了,对于前者依然遵循此规则,后者就是取
1也就是两者中小的一个hang>lie?lie:hang/
2.每条对角线的长度,也就是我们初始化二维数组中numbers[][j]的大小。
我们可以发现,对角线个数关于y=x个数对称,无论奇还是偶。所以我们以y=x包括
y=x作为分割线,取左上部分利用对称初始化数组。
numbers[i]=new int[i+1];
numbers[ceng-1-i]=new int[i+1] ;
在这里无论奇数还是偶数,偶数的化刚好,奇数好像多一个,
但是这个公式在奇数中到了结尾也就是最中间的时候上下两个式子
下标都一样,没事就是这个数组引用了两次新建的不同数组,被覆盖的那个
被虚拟机回收了,没事的,我们这样提高了通用性。
但是,随后我就被卡了一个测试点,就是3×5的矩阵,我发现这个规律有问题,
因为3×5对角线长度最多也就是3,但我的是4.于是我想是不是长度限制
在两者之间的较小数呢
有一下公式
numbers[i]=new int[i+1>t?t:i+1];
numbers[ceng-1-i]=new int[i+1>t?t:i+1] ;
这样就解决了这一问题,长度
3.内容
我的模拟办法是先从最顶部,也就是1 2 3从左上往右下取对角线。
(1)
我们设一个外循环来模拟列的移动,内循环来模拟存入的在数组中的位置
我们外循环会从1-3依次。
我们固定一次外循环,将外循环看成静态,看看内循环
我们内循环次数应该是这个对角线的长度,在第二点就已经解决了。
规律:我们内循环每次都是从0开始,如2【0】【1】 的移动,从2到4【1】【0】,行+1,和j同步,找规律最好找不变值(i+j=count),count是我们的层数
嘿嘿,层数现在起左用了。我们列方程求出列x+j=count.x=count-j.
for(int i=0;i<lie;i++,count++)
{//从列来取对角线
for(int j=0;j<numbers[count].length;j++)
{
numbers[count][j]=matrix[j][count-j];
}
}
再如3-7 [0] [2]–[1][1]–[2][0],都是第一个下标随j,第二个遵循此方程。
(2)3——9的模拟
我们的外循环i模拟的是6-9的移动,也就是行的变化,i代表行
我们来看6【1】【2】到8【2】【1】,我们也有规律,i+j==count。
我们内循环j的的增加也引起行的下移,我们的第一个下标规律是[j+i]也就是移动的行+行的起点,第二个下标也用方程解出来.
for(int i=1;i<hang;i++,count++)
{//从行取对角线
for(int j=0;j<numbers[count].length;j++)
{//i,j关系比较难想,先模拟一个坐标随i的变化在列方程(x+y=count)
numbers[count][j]=matrix[j+i][count-j-i];
}
}

class Solution {public int[] findDiagonalOrder(int[][] matrix) {if(matrix==null||matrix.length==0)   //数组为空return new int[0];                        //建立一个空数组else {int lie = matrix[0].length;             //行,列的大小int hang  = matrix.length;int ceng =hang+lie-1;       //一共需要多少层,也就是对角线的个数(观察所得)if(lie!=1&&hang!=1){      //这个特殊处理,比如1*6,层应该是1,不是1*6-1=5.int [][]numbers=new int[ceng][];for(int i=0;i<(ceng+1)>>1;i++) {//奇偶通吃int t=hang>lie?lie:hang;/*t是保存行和列两者之间小的一个之前每一层的元素个数找的规律有BUG,这是修正后的  *///以下是对称赋予长度(关于y=x对称?)numbers[i]=new int[i+1>t?t:i+1];numbers[ceng-1-i]=new int[i+1>t?t:i+1] ;}int count=0; //记录层数for(int i=0;i<lie;i++,count++){//从列来取对角线for(int j=0;j<numbers[count].length;j++){numbers[count][j]=matrix[j][count-j];}}for(int i=1;i<hang;i++,count++){//从行取对角线for(int j=0;j<numbers[count].length;j++){//i,j关系比较难想,先模拟一个坐标随i的变化在列方程(x+y=count)numbers[count][j]=matrix[j+i][count-j-i];}}for(int i=0;i<numbers.length;i++){//对于奇偶对角线要区分if(i%2==0){for(int j=0;j<numbers[i].length >>1;j++){//倒置int t=numbers[i][j];numbers[i][j]=numbers[i][numbers[i].length-j-1];numbers[i][numbers[i].length-j-1]=t;}}}int nums[] =new int[lie*hang];//用来把二维转化成1维int size=0;for(int i=0;i<numbers.length;i++){for(int j=0;j<numbers[i].length;j++){nums[size++]=numbers[i][j];}}return nums ;}else {//这是对于1*6这种一个边为1的区分,这种规律特殊,应该只有一层也就是两者中小的int numbers[]=new int[lie>hang?lie:hang];int count=0;for(int i=0;i<matrix.length;i++){for(int j=0;j<matrix[i].length;j++){numbers[count++]=matrix[i][j];}}return numbers ;}}}
}

leetcode练习 对角线遍历(二维数组)相关推荐

  1. 二维数组更改vue_使用vue中的v-for遍历二维数组的方法

    如下所示: {{itemss}} 其中,data数据为: this.data = [ [ { type: '', name: '资产', start: '期末余额', end: '期初余额' }, { ...

  2. C++知识点杂记1——typedef、static_cast、const_cast、遍历二维数组、聚合类

    1.typedef typedef一般是对某种类型的类型别名(不是变量别名) typedef double db;void mixtypename() {db d=1.2;cout<<d& ...

  3. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  4. 微信小程序遍历二维数组

    在微信小程序中遍历二维数组,代码如下 data 中二维数组结构如下 data: {familys:[{familyName:'贾家', users: [{name:'贾宝玉'},{name:'贾元春' ...

  5. 如何创建二维数组 微信小程序_微信小程序遍历二维数组

    在微信小程序中遍历二维数组,代码如下 data 中二维数组结构如下 data: { familys:[ { familyName:'贾家', users: [ {name:'贾宝玉'}, {name: ...

  6. c语言二维数组行优先如何访问快,C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why?...

    C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why? 简单粗暴的答案:存在Cache机制! 稍微啰嗦一点:CPU访问内存(读/写,遍历数组的话主要是读) ...

  7. python中遍历二维数组_python遍历二维数组-女性时尚流行美容健康娱乐mv-ida网

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页  > 高级搜索 二 维 数组 5.2.1 二 ...

  8. 漫画:如何螺旋遍历二维数组?

    作者 | 小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui)  第二天   什么意思呢?我们来举个例子,给定下面这样一个二维数组: 我们需要从左上角的元素1开始,按照顺时针进行螺 ...

  9. c语言对用下标法二维数组遍历,二维数组遍历:下标法与指针法的较量

    在图像的采集中,常常需要用到二维数组,这里数组的遍历是指按照一定的顺序访问数组中所有的元素. 在众多的遍历方法中,下标法和指针法是两种常用的方法.但在使用的时候,我们只需要选择其中的一种,那么如何选择 ...

最新文章

  1. 多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?...
  2. 美团外卖美食知识图谱的迭代及应用
  3. 特斯拉「断网」致500名车主被锁车外,最长5小时,网友:有些东西就不该经过网络...
  4. wxWidgets:日志概述
  5. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
  6. ecshop 模板 php代码,ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法...
  7. 基于 HTML5 WebGL 的 3D 渲染引擎构建工厂运作系统
  8. Node路由简单的处理
  9. Bailian2884 Problem III【入门】
  10. transform、accumulate —— C++ 下的 MapReduce
  11. java有趣的平方数,蓝桥杯——四数平方(2016JavaB第7题)
  12. 2022年11月份PMP考试是新版教材吗?
  13. Spss典型相关分析的常见问题
  14. 妥妥的世界第一:为什么MT4软件的地位无法撼动?
  15. 无人机航模电池上面有20C 30C,这是放电倍率
  16. 【演讲实录+视频】走近40+世界级AI专家!第三届中国人工智能大会资料分享(直播进行中_不断更新)
  17. Python解压所有压缩包到同一文件夹下
  18. 无线互联网时代的中国移动(转)
  19. 脱机外挂的时代来临了
  20. 计算机试题汇编2007,AUTOCAD2007试题汇编电子教材与答案

热门文章

  1. row是行还是列python中_Python:区分行和列向量
  2. c语言noj答案,NOJ答案c++版.docx
  3. 下拉列表框标记p24
  4. FZU 1077 铁皮容器
  5. 基本数据类型与包装类类型转换
  6. js实现数据量换算问题
  7. 西游记中奎木狼出现的四次
  8. 公务员考试计算机基础试题,2019年国家公务员考试计算机基础试题6
  9. Linux--查看常驻进程:ps
  10. Android中添加常驻通知栏