LeetCode498 对角线遍历
2024-09-01 22:09:50
给定一个含有 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.对角线遍历
/*
算法思想:
有类题属于直观上很好理解,但是写起来却不知如何下手。这题就属于此类。
这道题好处是给了一个图例,而图例又不像另一种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;
}
};
最新文章
- 我的前端故事----疯狂倒计时(requestAnimationFrame)
- 机器学习常用Python扩展包
- C#实现按键精灵的&#39;找图&#39; &#39;找色&#39; &#39;找字&#39;的功能
- pomelo获取客户端IP
- Javascript获取随机数
- 求当前时间100天后的时间日期,格式化为xxxx年xx月xx日
- python 正则表达式(一)
- java 判断是不是检查性异常
- PHP安全编程:网站安全设计的一些原则(转)
- iOS中判断设备系统版本
- poj 3311 状压DP
- Kafka (一)
- Flex 弹性盒模型
- tableView区头不显示
- 第一章 开发简单Java应用程序
- OKMX6Q LTIB编译
- js基础复习点
- 为什么要将Apache与Tomcat集成?(或不)
- Mysql Binlog三种格式介绍及分析【转】
- JQuery中serialize()方法的使用