【LeetCode】4月2日打卡-Day18-矩阵操作

题1 生命游戏

描述

根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的
示例:
输入:
[
[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]
输出:
[
[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]
进阶:
你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

题解

这个题和之前的地图题很像,实现思路没有问题,但是实现的时候有问题。我第一个的问题出在把if判断写成了while导致超时,第二个的问题出在忘了要同步更新这个要求,各自必须同时更新,所以需要保留原始的格子的值。

法1:拷贝矩阵: 因为需要再创建一个二维矩阵保存原始数据所以内存消耗较大

执行用时 :1 ms, 在所有 Java 提交中击败了37.80%的用户
内存消耗 :38.2 MB, 在所有 Java 提交中击败了5.71%的用户

class Solution {public void gameOfLife(int[][] board) {int[] neighbors = {1,-1,0};int[][] copyBoard = new int[board.length][board[0].length];for(int i = 0; i < board.length; i++){for(int j = 0; j < board[0].length; j++){copyBoard[i][j] = board[i][j];}}for(int i = 0; i < board.length; i++){for(int j = 0; j < board[0].length; j++){int alive = 0;for(int a = 0; a < 3; a++){for(int b = 0; b < 3; b++){if(neighbors[a]!=0 || neighbors[b] != 0){int r = i+neighbors[a];int c = j+neighbors[b];if(r>=0&&r<board.length&&c>=0&&c<board[0].length&&copyBoard[r][c]==1){alive++;}}}}// 规则 1 或规则 3      if ((copyBoard[i][j]==1)&&(alive<2||alive>3)) {board[i][j] = 0;}// 规则 4if (copyBoard[i][j] == 0 && alive == 3) {board[i][j] = 1;}}}}
}

法2 定义复合状态法
空间复杂度为O(1) 时间复杂度同上O(mn)

根据数组的细胞状态计算新一轮的细胞状态,这里会用到能同时代表过去状态和现在状态的复合状态。
具体的计算规则如下所示:
规则 1:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡。这时候,将细胞值改为 -1,代表这个细胞过去是活的现在死了;
规则 2:如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活。这时候不改变细胞的值,仍为 1;
规则 3:如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡。这时候,将细胞的值改为 -1,代表这个细胞过去是活的现在死了。可以看到,因为规则 1 和规则 3 下细胞的起始终止状态是一致的,因此它们的复合状态也一致;
规则 4:如果死细胞周围正好有三个活细胞,则该位置死细胞复活。这时候,将细胞的值改为 2,代表这个细胞过去是死的现在活了。

class Solution {public void gameOfLife(int[][] board) {int[] neighbors = {0, 1, -1};int rows = board.length;int cols = board[0].length;// 遍历面板每一个格子里的细胞for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {// 对于每一个细胞统计其八个相邻位置里的活细胞数量int liveNeighbors = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (!(neighbors[i] == 0 && neighbors[j] == 0)) {// 相邻位置的坐标int r = (row + neighbors[i]);int c = (col + neighbors[j]);// 查看相邻的细胞是否是活细胞if ((r < rows && r >= 0) && (c < cols && c >= 0) && (Math.abs(board[r][c]) == 1)) {liveNeighbors += 1;}}}}// 规则 1 或规则 3 if ((board[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {// -1 代表这个细胞过去是活的现在死了board[row][col] = -1;}// 规则 4if (board[row][col] == 0 && liveNeighbors == 3) {// 2 代表这个细胞过去是死的现在活了board[row][col] = 2;}}}// 遍历 board 得到一次更新后的状态for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {if (board[row][col] > 0) {board[row][col] = 1;} else {board[row][col] = 0;}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/481021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习扫盲贴:从Q-learning到DQN

本文转载自知乎专栏「机器学习笔记」&#xff0c;原文作者「余帅」&#xff0c;链接https://zhuanlan.zhihu.com/p/358829371 本文学习目标1. 复习Q-Learning&#xff1b;2. 理解什么是值函数近似&#xff08;Function Approximation&#xff09;&#xff1b;3. 理解什么是DQN&…

【LeetCode】4月1日打卡-Day17-括号匹配/嵌套深度

题1 有效括号的嵌套深度 题解 要求划分出使得最大嵌套深度最小的分组&#xff0c;我们首先得知道如何计算嵌套深度。我们可以通过栈实现括号匹配来计算&#xff1a; 维护一个栈 s&#xff0c;从左至右遍历括号字符串中的每一个字符&#xff1a; 如果当前字符是 (&#xff0c;…

肖仰华 | 基于知识图谱的可解释人工智能:机遇与挑战

本文转载自公众号知识工场&#xff0c;整理自 2017 年 10 月 13 日肖仰华教授在 CIIS2017 中国智能产业高峰论坛上所做的报告。 肖仰华&#xff1a;很高兴有机会跟大家一起分享《基于知识图谱的可解释人工智能&#xff1a;机遇与挑战》。 刚才刘总的报告中提到了机器和人类将来…

对话系统的设计艺术(完结)

Motivation对话是一个很大的概念&#xff0c;有非常非常多的子问题&#xff0c;刚入坑的小伙伴很可能迷失在对话的一小块区域里无法自拔&#xff0c;本文就是为解决这一类问题的。希望读者在看完本文后&#xff0c;可以理清楚对话的每个概念为什么而存在&#xff0c;以及它在整…

2018届校招面经精选

https://www.zhihu.com/question/23259302 牛客网​已认证的官方帐号819 人赞同了该回答最好的办法就是看看别人是怎么准备的&#xff0c;通过别人的面经来反思自己如何准备。针对应届生校招面试 “机器学习” 相关岗位的情况&#xff0c;牛妹为大家整理了一批面经&#xff0c…

【Java】列表、集合、哈希表和可变参数

1 List 1.1 List的特点 List接口继承自Collection接口List是有序集合&#xff0c;存取顺序一致允许存储重复元素 1.2 List的特有方法【带索引】 public void add(int index, E element);public E get(int index)public E remove(int index)&#xff1a;返回移除元素public …

白硕 | 知识图谱,就是场景的骨架和灵魂

本文转载自公众号恒生技术之眼 知识图谱&#xff0c;目前已在全世界得到了重视和应用&#xff0c;成为当下人工智能热的一个重要组成部分。它究竟是怎样的一种技术&#xff1f;它的应用场景在哪里&#xff1f;未来国内企业该如何发展&#xff1f;让我们一起来聊聊。 从知识图谱…

您的DST大礼包请查收

本文转载自刘冲大佬&#xff08;知乎id&#xff1a;呜呜哈&#xff09;的知乎文章&#xff0c;链接&#xff1a;https://zhuanlan.zhihu.com/p/40988001除本文外&#xff0c;作者还写了很多对话相关的良心好文&#xff01;做对话的小伙伴千万不要错过这位良心答主噢(&#xffe…

LSTM长短记,长序依赖可追忆(深度学习入门系列之十四)

摘要&#xff1a;如果你是一名单身狗&#xff0c;不要伤心&#xff0c;或许是因为你的记忆太好了。有时&#xff0c;遗忘是件好事&#xff0c;它让你对琐碎之事不再斤斤计较。然而每当自己记不住单词而“问候亲人”时&#xff0c;也确实气死个人。于是你懂得了如何控制好什么信…

【Java】如何理解Java中的双列集合Map?

1 Map<K,V>接口 1.1 特点 双列集合一个元素包含俩值Key不可以重复&#xff0c;Value可以重复Key和Value一一对应Key和Value可以时任意类型 1.2 常用方法 public V put(K key, V value): 不重复返回null&#xff0c;重复返回value public static void main(String[] a…

技术动态 | 清华大学开源OpenKE:知识表示学习平台

本文转载自公众号机器之心&#xff0c;选自 THUNLP。 清华大学自然语言处理实验室近日发布了 OpenKE 平台&#xff0c;整合了 TransE、TransH、TransR、TransD、RESCAL、DistMult、HolE、ComplEx 等算法的统一接口高效实…

多任务学习时转角遇到Bandit老虎机

注&#xff1a;本文的正文干货转载并少量修改自大佬覃含章&#xff08;知乎id同名&#xff0c;知乎必关的数值优化大佬啊啊&#xff09;的一篇知乎回答&#xff0c;链接https://www.zhihu.com/question/53381093/answer/562235053一个转角事情是这样的&#xff0c;最近小夕在做…

NLP13-LDA引发的一系活动

摘要&#xff1a; 目标是想了解也学习LDA&#xff0c;寻找学习LDA相关资料&#xff0c;学习LDA相关的概率基础&#xff0c;对于LSI&#xff0c;pLsa,LDA作为主题模型的对比&#xff1b;然后到LDA本身&#xff0c;对LDA相关的概率基础进行学习。把相关资料疏理与集合起来。

王昊奋 | 从聊天机器人到虚拟生命:AI技术的新机遇

本文转载自公众号中国人工智能学会。 10月12-13日&#xff0c;第七届中国智能产业高峰论坛在佛山开幕&#xff0c;在NLP与服务机器人专题论坛上&#xff0c;深圳狗尾草CTO王昊奋发表了主题为《从聊天机器人到虚拟生命&#xff1a;AI技术的新机遇》的精彩演讲。 以下是王昊奋老师…

【Java】如何理解Java中的异常机制?

1 异常的概念 程序在执行过程中出现非正常线性&#xff0c;导致JVM非正常停止异常不是语法错误 2 异常的分类 Throwable是所有错误或异常的超类Exception是编译期间异常&#xff08;写代码时IDE会报错&#xff09;RuntimeException时运行期异常&#xff0c;程序运行时出现的…

文本匹配相关方向总结(数据,场景,论文,开源工具)

Motivation 前不久小夕在知乎上写了一个回答《NLP有哪些独立研究方向》&#xff0c;于是有不少小伙伴来问分类和匹配的参考资料了&#xff0c;鉴于文本分类的资料已经超级多了&#xff0c;就不写啦&#xff08;不过分类相关的tricks可以看之前写的这篇文章《文本分类重要tricks…

机器学习】LDA线性判别分析

【机器学习】LDA线性判别分析1. LDA的基本思想2. LDA求解方法3. 将LDA推广到多分类4. LDA算法流程5. LDA和PCA对比【附录1】瑞利商与广义瑞利商线性判别分析 (Linear Discriminant Analysis&#xff0c;LDA)是一种经典的线性学习方法&#xff0c;在二分类问题上因为最早由[Fish…

科普 | 动态本体简介

本文转载自知乎专栏知识图谱和智能问答。 1 近年来&#xff0c;随着语义Web的兴起&#xff0c;本体技术受到了广泛关注。很多大型跨国公司都开始研究本体技术。谷歌于2012年提出了知识图谱的项目&#xff0c;旨在利用本体技术来提高搜索的精度和更智能化的知识浏览。国内的互联…

【LeetCode】4月3日打卡-Day19-字符串转整数

描述 请你来实现一个 atoi 函数&#xff0c;使其能将字符串转换成整数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。接下来的转化规则如下&#xff1a; 如果第一个非空字符为正或者负号时&#xff0c;则将该符号与…