【LeetCode】4.Array and String — Diagonal Traverse 对角线遍历

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.

Example:

Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output:  [1,2,4,7,5,3,6,8,9]
Explanation:

Note:

The total number of elements of the given matrix will not exceed 10,000.

这一题我写了一下午(看在自己刚入门和智商的份上,原谅自己)

本来打算放弃了,后来强行在纸上画图,找规律,写逻辑,最终把代码编了出来,努力和坚持还是有回报的 O(∩_∩)O哈哈~

总体思路:把二维数组看成一个矩形,对应的四条边列出相应的四条判断规则,当遍历的元素“碰”(想象一下为一个会动的点在一个矩形中移动)到矩形的边时,根据规则改变方向。

从数组第一个元素开始,最后一个元素为结束。具体解释放在代码的注释里,就不多说了,脑子快炸了。。。

class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
    if (matrix.size()==0) return{}; //判断数组是否为空
    vector<int> result; //存放结果的数组
    int M = matrix.size();//获取数组的行数
    int N = matrix[0].size();//获取数组的列数
    int  m=0, n = 0;        //两个计数器,分别对应M、N
    result.push_back(matrix[m][n]);  //将matrix[0][0]加入到数组中.
    while (!(m==M-1 && n==N-1)) { //当遍历到最后一个元素matrix[M][N]时,循环结束.
            if (m == 0 && n < N-1) {  //请把二维数组脑补成一个矩形,这里判断的是矩形的上边规则,即当元素遍历到矩形的上边.
                result.push_back(matrix[m][++n]);
                while (n >0&&m<M-1)/右移一位,然后向左下方遍历.
                {
                    m++; n--;
                    result.push_back(matrix[m][n]);
                }
            }
            else if (n == 0 && m < M-1) //矩形的左边.即当元素遍历到矩形的最左边.
            {
                result.push_back(matrix[++m][n]);
                while (m >0&&n<N-1) //下移一位,然后向右上方遍历.
                {
                    m--; n++;
                    result.push_back(matrix[m][n]);
                }
            }
            else if ( n == N - 1 && m != M - 1) //矩形的右边.即当元素即将遍历到最右边.
            {
                result.push_back(matrix[++m][n]);
                while (m < M - 1&&n>0) //下移一位,然后向左下方遍历.
                {
                    m++; n--;
                    result.push_back(matrix[m][n]);
                }
            }
            else if ( m == M - 1 && n != N-1)//矩形的下边.即当元素遍历到最下边.
            {
                result.push_back(matrix[m][++n]);
                while (n <N-1&&m>0) //右移一位,然后向右上方遍历.
                {
                    m--; n++;
                    result.push_back(matrix[m][n]);
                }
            }
    }
    return result;
 }
};

原文地址:https://www.cnblogs.com/hu-19941213/p/10932361.html

时间: 2024-09-30 10:07:22

【LeetCode】4.Array and String — Diagonal Traverse 对角线遍历的相关文章

498. Diagonal Traverse 对角线遍历矩阵

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image. Example: Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,4,7,5,3,6,8,9] Explanation: Note: The total

498. Diagonal Traverse对角线z型traverse

[抄题]: Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image. Example: Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,4,7,5,3,6,8,9] Explanation: [暴力解法]: 时间

Leetcode 344:Reverse String 反转字符串(python、java)

Leetcode 344:Reverse String 反转字符串 公众号:爱写bug Write a function that reverses a string. The input string is given as an array of characters char[]. Do not allocate extra space for another array, you must do this by modifying the input array in-place wit

Array和String方法总结—实例

说明:每一部分总结后面有实例代码,代码中黄色框的方法不会改变原数组.                  代表array和string共有的方法             代表参数 Array --普通方法 栈:   pop()   push(多个项) 队列:shift()  unshift(多个项) 排序:sort([函数])  reverse() 转换:toString()  toLocateString()   join([分隔符]) 操作:concat([多个项])     slice(起点

Bean、List、Map、Array、String与JSON字符串的相互转换

import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map;

leetcode第一刷_Scramble String

字符串的好题.题干解释的非常复杂,一下让人不知所措了. 这道题到底是什么意思呢?最终的结果是把一个字符串中字母的顺序打乱了,让你判断一个字符串能不能由另一个字符串打乱得到.那打乱这个过程是怎么做的呢,很简单,给你一个字符串,你必须先找一个点把它砍成两半,你可以通过交换这两半的顺序来打乱源字符串的顺序,也就是在两半中的字符与另一半中所有字符的相对顺序是统一的.对于每一半,都可以重复上面的过程. 那想一下,怎么知道打断的那个点在哪呢?穷举.怎么知道打断之后有没有做交换操作呢?两种情况递归,有一条走的

golang array, slice, string笔记

本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io. array: 数组的长度是该数组类型的一部分,例如var buffer [256]byte 的类型是[256]byte, len(buffer)总是返回256. slice: 一个slice描述一个数组中连续的一部分,例如var slice = buffer[100:250].slice也可以从slice产生,如var slice2 = slice

mongodb 更新数组出现can&#39;t append to array using string field name

数据库内容大概如下: { _id:1, "hero_list" : { "15521" : { "stars" : 0, "_id" : 15521, "equip" : [ [ ], [ ], [ ], { "item_id" : 310141, "lv" : 103, "uuid" : "4a727ee1-e7b0-4265-b004

leetcode第一刷_Interleaving String

有关这种字符串的题真是层出不穷啊,而且他们都有这样一个特点,就是递归的思路如此简单,但一定超时! 这个时候,dp就朝我们缓缓走来.递归超,dp搞!这道题的状态转移方程还是比较好写的,用ispart[i][j]代表s1贡献i长,s2贡献j长时,能不能形成s3的前i+j个字符.更新可以按照行或者列开始,s3的前i+j个字符,可以是((i-1)+1)+j构成,也可以是i+((j-1)+1)构成,这取决于当前的这个字符s3[i+j-1]跟s1[i-1]和s2[j-1]是否相等,或的关系就可以解决问题.