01.分治法和减治法区分

  • 参考自『维基百科
  • 分治法这个名称有时亦会用于将问题简化为只有一个细问题的算法,例如用于在已排序的列中查找其中一项的折半搜索算法(或是在数值分析中类似的勘根算法)。这些算法比一般的分治算法更能有效地运行。其中,假如算法使用尾部递归的话,便能转换成简单的循环。但在这广义之下,所有使用递归或循环的算法均被视作“分治算法”。
  • 因此,有些作者考虑“分治法”这个名称应只用于每个有最少两个子问题的算法。而只有一个子问题的曾被建议使用减治法这个名称。

02.减治法思路的代码

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> res;
        if( 0==matrix.size() ) 
        {
            return res;
        }

        //左上和右下2个点确定一个矩形
        int LeftUpRow=0,LeftUpCol=0;
        int RightDownRow=matrix.size()-1,RightDownCol=matrix[0].size()-1;

        //开始『减而治之』的遍历
        while( LeftUpRow<=RightDownRow && LeftUpCol<=RightDownCol )
        {
            for(int loop=LeftUpCol; loop<=RightDownCol; ++loop)
            {
                res.push_back( matrix[LeftUpRow][loop] );
            }
            ++LeftUpRow;//遍历完一行之后,将左上角的点移动位置『减而治之』

            //易错,比如[ [2,3] ]这样的样例
            if( LeftUpRow>RightDownRow || LeftUpCol>RightDownCol ) break;
            for(int loop=LeftUpRow; loop<=RightDownRow; ++loop)
            {
                res.push_back( matrix[loop][RightDownCol] );
            }
            --RightDownCol;

            if( LeftUpRow>RightDownRow || LeftUpCol>RightDownCol ) break;
            for(int loop=RightDownCol; loop>=LeftUpCol; --loop)
            {
                res.push_back( matrix[RightDownRow][loop] );
            }
            --RightDownRow;

            if( LeftUpRow>RightDownRow || LeftUpCol>RightDownCol ) break;
            for(int loop=RightDownRow; loop>=LeftUpRow; --loop)
            {
                res.push_back( matrix[loop][LeftUpCol] );
            }
            ++LeftUpCol;
        }

        return res;
    }
};