思考算法题 之126 357 489

[    

    [1,     2,     6]    ,

    [3,     5,     7]    ,

    [4,     8,     9]    ,

]

一个二维数组, N行, M列, 按照如上规则排序.

希望将该数组输出, 其结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9]


遇到如上情况时, 有些人可能会一头雾水. 算法哎, 不会不熟哎. 要不要去刷刷算法题? 

在我看来, 需要这种情况, 第一步是先摸清规则. 尝试把复杂的问题, 拆分, 拆分, 一个大问题, 拆成十个中问题, 一个中问题, 拆分成十个小问题, 一个小问题, 再拆分成十个点. 这一千个点, 每个都没有那么难了.

上述题目, 观察看来, 他的数值是斜着 变化的, 即 [向右上]增加, 和[左下走] 增加. 二维数组, 是M和N来定位数值. 

[        M0    M1    M2

N0:    [1,      2,      6]    ,

N1:   [3,      5,      7]    ,

N2:   [4,      8,      9]    ,

]

第一步分析

分析一下斜着走, 是如何做到的,  2 的坐标系[N, M] 换成数值就是 [0, 1] . 当2 -> 3变动时, 向下走一行, N + 1. 同时向左走一列, M - 1 ; [0, 1] -> [1, 0]

当4 -> 5变动时, 向上走一行, N - 1. 同时向右走一列, M + 1 ; [2, 1] -> [1, 1]

当N 加 1 时, M 就减 1. 当 N 减 1 时, M 就加 1. 这个是斜着走的规则. 按照如上规则, 一直斜着走, 就能一直找到坐标.

第二步分析

斜着走, 总有遇到 数组 边界 的时候. 就像按照斜着走的规则, 当3 向4的坐标走的时候.



数字4 应该是继续沿用原本规则, 向左下方前进. 但是这样的话, 就会导致数组 索引越界 3 [1, 0] -> 4 [2, -1]. -1明显不在 数组的索引 0 .. 2 之间, 这时候, 就需要强制让数字落在 正常 的范围内. 那么[2, -1] -> [2, 0].

当m或者n的值, 小于0时, 让其变为0. 防止出界. 可以处理之前遇到的问题, 但是还有新的问题, 当m或者n大于2的时候, 让他们等于2, 是不是正确的方法呢. 同时大于, 小边界时呢.

这时发现, 数字斜着走, 是会遇到 边界 的那么, 第二步, 就是处理所有的边界问题, 

1. M < 0, N正常

2. M > 2, N正常

3. M < 0, N < 0

4. M < 0, N > 2

5. N < 0, M正常

6. N > 2, M正常

7. N < 0, M > 2

8. N > 2, M > 2

有以上8种, 会导致, M和N越界的情况. 通过if else处理当各种情况异常时, 如何处理.

第三步分析

分析如何循环, 程序将二维数据按规则排序. 如何自动化的进行.

这时, 首先想到的, 可能是 递归, 自己调用自己, 逐步完成. 

通过方法的参数拿到一个坐标数据, 计算他的下一个位置, 打印出来. 递归 将当前坐标当做参数传入方法

再次计算下一个坐标, 打印. 递归 将当前坐标传入

通过方法的参数拿到坐标数据, 打印出来. 计算下一个坐标, 通过递归 将新坐标传入方法

再次打印坐标数据, 计算下一个坐标. 如此反复.


递归可能是比较容易想到的一个解决方案, 它提供了简单的解决思路. 但是递归是有缺点的. 当M和N足够大时, 斜着的一行就会无限长, 递归的次数就会增加, 递归 会就变成 func -> func -> func ->func ->func ->func -> ..... 当递归层级达到一定程度, 就会报错. 所以, 此时 还需要另一种解决思路, 用循环代替递归. 这里暂且不谈该方式

第四步分析

如何结束, 无论采用递归/循环 等方式, 如何达成条件, 结束 递归/循环.

最先想到的, 可能是, 当M和N同时大于2的时候, 结束. 但实际上, 是不会的, 因为按照上述流程, 先打印坐标数据, 坐标值, 一定在范围内. 第二步, 计算下一个坐标的位置. 如果越界了, 会自动处理, 让M和N回到合理范围内.

所以M和N, 永远不会越界. 

我采用的方式是, 用一个新的一维数组, 每次 打印 数据时, 不是打印, 而是将数据 add到数据中. 当结束后, 得到的数组, 就是最终顺序的数据集合.

结束方式也是, 将数据添加到数据中, 当数组的长度, 等于 M x N时, 即所有数据已经处理完全. 退出 循环/ 递归 即可.

第五步分析

如何开始, 这个在第三步的时候, 我写了一段 划线.

这个是我一开始思维上遇到的错误, 喜欢先去计算. 拿到数据时, 先计算, 再输出结果. 但是问题来了, (0, 0) 的坐标数据, 在什么时候输出呢? 如果方法调用前, 先输出 (0, 0), 那么没有任何问题, 但是这样似乎不太符合方法的完整性. 这个方法不能完整的处理这个算法.

所以改成了, 先打印, 再计算. 如果打印时, 已经满足结束条件, 那么也不用再进行计算了

第六步分析

数据问题, 上述题目描述的比较简单, 直观的看起来, 处理看到的问题.

但是其中还隐藏着一些没能看到的问题.  第二步边界处理时, 有8种情况, 但是 题目中, 不会遇到全部8中情况,

[1,      2,      6,      7]

[3,     5,      8,      13]

[4,     9,      12,     14]

[10,   11,     15,     16]

如果 M和N是个 4x4的数组呢? 5x5呢?  3x5呢? 9x4呢? 就会遇到全部的边界问题了.



后记: 递归变为 循环.

上述情况 每次处理 m, n

Ary result;

func (int m, int n){

    if( result.count >= (m * n) ){

        return;

    }

    ....

    ....

    m = ...;

    n =  ...;

    func (m, n);

}


while(result.count < (m * n) ){

    ....

    ....

    m = ...;

    n =  ...;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,343评论 0 2
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    十里江城阅读 1,186评论 0 1
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,816评论 2 16
  • 今天是周六,也是2018最后一个工作日,可是我的手机闹钟却没有响。安卓机的闹钟有个很人性化的功能,可以设置法定工作...
    叶加兰兰阅读 329评论 0 4
  • 丢掉那沾满世俗的虚伪, 收起那毫无情况的笑容, 我带着最真实的自己, 踏进那被称为家的地方! 家是一个温暖的空间,...
    无敌老超人阅读 523评论 6 9