• leetcode Spiral Matrix


    题目:螺旋输出数组(听师兄说是今年google电话面试题)

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

    For example,
    Given the following matrix:

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

    You should return [1,2,3,6,9,8,7,4,5].

    定义四个变量,上下左右,别人记录螺旋到的界限。到每一个边界,都需要判断是否遍历完。我用的是每个边界条件的判断。详见代码。leetcode的时间估计是不怎么准的,加了注释之后,说只运行了4ms。

    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int> > &matrix) 
        {
            vector<int> ans;
            if (matrix.size() == 0)
                return ans;
            int i = 0, j = 0, prei = -1, prej = -1, left = 0, up = 0, right = matrix[0].size() - 1, down = matrix.size() - 1;
            while(left <= right && up <= down)
            {
                prei += 1; prej += 1;
                i = prei; j = prej; // 绕一圈回来,如果还能继续走,那么下一个起点肯定是在之前起点右下方
                while(j <= right)
                {
                    ans.push_back(matrix[i][j]); j++; // 把这一行输出
                }
                j--; i++;
                if (down == up) return ans; // 如果up和down属于同于一排了,说明无需再向下了
                while(i <= down)
                {
                    ans.push_back(matrix[i][j]); i++;// 把最后一列输出(不包括和刚才输出行的最后一个)
                }
                i--; j--;
                if (left == right) return ans;// 如果左右相等了,说明无需再向左了
                while(j >= left)
                {
                    ans.push_back(matrix[i][j]); j--;// 把左后一行向左输出
                }
                if (down == up + 1) return ans; // 满足这个时,已经不能再向上了
                j++; i--;
                while(i > up)
                {
                    ans.push_back(matrix[i][j]); i--; // 把最左边一列输出
                }
                if (left == right - 1) return ans;//满足这个说明已经不能再向右了
                left++; right--; up++; down--;//更新各个值
            }
            return ans;
        }
    };

    其实也可以用一个cnt变量记录,如果cnt等于总的元素个数就结束。基本代码和上述一样,如下折叠代码。

    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int> > &matrix) 
        {
            vector<int> ans;
            if (matrix.size() == 0)
                return ans;
            int cnt = 0, i = 0, j = 0, prei = -1, prej = -1, left = 0, up = 0, right = matrix[0].size() - 1, down = matrix.size() - 1;
            int total = (matrix.size())*(matrix[0].size());
            while(left <= right && up <= down)
            {
                prei += 1; prej += 1;
                i = prei; j = prej; // 绕一圈回来,如果还能继续走,那么下一个起点肯定是在之前起点右下方
                while(j <= right)
                {
                    ans.push_back(matrix[i][j]);cnt++;j++; // 把这一行输出
                }
                j--; i++;
                if (cnt == total) return ans;// 
                while(i <= down)
                {
                    ans.push_back(matrix[i][j]);cnt++; i++;// 把最后一列输出(不包括和刚才输出行的最后一个)
                }
                i--; j--;
                if (cnt == total) return ans;// 
                while(j >= left)
                {
                    ans.push_back(matrix[i][j]); cnt++;j--;// 把左后一行向左输出
                }
                if (cnt == total)  return ans; // 
                j++; i--;
                while(i > up)
                {
                    ans.push_back(matrix[i][j]); cnt++; i--;// 把最左边一列输出
                }
                if (cnt == total) return ans;//
                left++; right--; up++; down--;//更新各个值
            }
            return ans;
        }
    };
    View Code
  • 相关阅读:
    CSS中各种长度单位总结
    Android中实现双击(多击)事件
    android 文件保存到应用和sd卡中
    在Eclipse中搭建Android开发环境
    算法空间复杂度
    我的Android案例签到日历
    Android使用SDKManager下载SDK速度慢 容易丢包和异常的解决办法
    Android应用系列:仿MIUI的Toast动画效果实现
    Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
    Android学习笔记之Menu的ShowAsAction属性的设置
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4070298.html
Copyright © 2020-2023  润新知