原地算法(数组向)

一.原地算法简单介绍

1.案例引入

生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
2.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
4.如果死细胞周围正好有三个活细胞,则该位置死细胞复活;


下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态【1】

        那么,按照题目要求,数组是同时更新的,肯定不能先按照规则更新其中一个,然后将新更新的值带入再进行更新。 

2.原地算法

        在上述案例中,如果使用深拷贝,问题将很容易解决,但一是耗费空间较大,二是如果在面试中,这种类型的题目肯定是想让你使用原地算法。

        原地算法,即不占用额外空间(少量占用),在不改变原本数据附带的信息的条件下,为数据附上新的信息。要注意,不是不改变原本的值,是不改变原本的值所附带的信息

        而有些题目的要求原地算法是一种要求,而不是像回溯或者动态规划这种问题的具体解法。

3.相关技巧

        那么,在生命游戏的案例中,1代表活细胞,0代表死亡细胞,那么,为数据附上新的信息,用2代表活细胞。但是,2同时代表此细胞是过去死亡,现在活着,即2承载了两个信息,一是此细胞活着,二是此细胞之间死亡,由于生存定律的第四条,它活了。那么用-1来代表此细胞是死亡的,但是,它过去是活的。 那么,现在细胞共有4种状态:

        -1(死亡,之前活),0(死亡),1(活的),2(活的,之前死)。

        总之就是在不改变数据原本附带的信息的状况下,为数据附加上新的信息,也可以理解为复合状态。当然,既然是原地,意味着有时候要根据题目要求进行状态回溯,根据新状态推出最后的结果。本质上相较于深拷贝是用时间换空间

二.leetcode实战

1.leetcode73 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

此题若使用O(MN)空间复杂度,那肯定不是出题者想要考察的目的,要在O(M+N)的基础上思考O(1)的解决方案。

O(M+N) 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值