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

示例:

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

说明:

  1. 给定矩阵中的元素总数不会超过 100000 。

//章节 - 数组和字符串
//二、二维数组简介
//1.对角线遍历
/*
算法思想:
有类题属于直观上很好理解,但是写起来却不知如何下手。这题就属于此类。
这道题好处是给了一个图例,而图例又不像另一种4向(右,左下,下,右上)画法让人误导,而是对角线,方向是右上、左下依次交替。因此,只需确定每条对角线的起点,由起点向右上延伸直到边界,再根据当前所在的行数判断是否需要逆序即可。每行的起始点如下:从[0,0]向下延伸到[m-1,0],再向右延伸到[m-1][n-1] */
//算法实现:
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
vector<int> result;
int m = matrix.size();
if(m == 0)
return result;
int n = matrix[0].size();
if(n == 0)
return result;
for(int i = 0, j = 0; i+j < m+n-1; ) { // 起点位置(0,0)->(m-1,0)->(m-1,n-1),然后每个起点右上延伸直到边界,每隔一行翻转一下
vector<int> tmp;
bool bflag = (i+j) & 0x01;
if(i < m) {
for(int x = i, y = 0; x>=0 && y<n; x--,y++) {
tmp.push_back(matrix[x][y]);
}
i++;
}
else if(i >= m) {
for(int x = i-1, y = j+1; x>=0 && y<n; x--,y++) {
tmp.push_back(matrix[x][y]);
}
j++;
}
if(bflag) { // bflag需要判断i+j,但是由于上面i和j已经累加了,所以要用bflag判断
reverse(tmp.begin(), tmp.end());
}
result.insert(result.end(), tmp.begin(), tmp.end());
}
return result;
}
};

最新文章

  1. 我的前端故事----疯狂倒计时(requestAnimationFrame)
  2. 机器学习常用Python扩展包
  3. C#实现按键精灵的&#39;找图&#39; &#39;找色&#39; &#39;找字&#39;的功能
  4. pomelo获取客户端IP
  5. Javascript获取随机数
  6. 求当前时间100天后的时间日期,格式化为xxxx年xx月xx日
  7. python 正则表达式(一)
  8. java 判断是不是检查性异常
  9. PHP安全编程:网站安全设计的一些原则(转)
  10. iOS中判断设备系统版本
  11. poj 3311 状压DP
  12. Kafka (一)
  13. Flex 弹性盒模型
  14. tableView区头不显示
  15. 第一章 开发简单Java应用程序
  16. OKMX6Q LTIB编译
  17. js基础复习点
  18. 为什么要将Apache与Tomcat集成?(或不)
  19. Mysql Binlog三种格式介绍及分析【转】
  20. JQuery中serialize()方法的使用

热门文章

  1. Codeforces Edu Round 63 A-E
  2. 【JSOI2019】精准预测(2-SAT &amp; bitset)
  3. jwt与springcloud联用
  4. hive实例的使用
  5. Android 11 源码下载+编译教程
  6. Python高级语法-深浅拷贝-总结(4.2.1)
  7. pandas的学习2-选择数据
  8. SpringBoot从入门到精通教程(四)
  9. webform中DropdownList绑定多个字段
  10. Python序列(十一)集合