当前位置: 首页 > news >正文

位操作解决数组的花样遍历

文章目录

题目

一、思路:

二、代码

总结


题目

leetcodeT289 https://leetcode.cn/problems/game-of-life/description/


一、思路:

这题思路很简单,对每个位置按照题目所给规则进行遍历,判断周围网格的活细胞数即可。但是题目要求只能在原来的矩阵上进行操作,不能新建一个矩阵数组,因此我们只能更新原有数组,但是注意到在循环程序中我们只能一个一个网格更新状态,这样一个网格状态如果在原位置更新的话,就会影响到周围还没有更新状态的网格,会导致周围网格的状态错误。因此,我们需要记录网格的更新前的状态和更新后的状态,由于网格只有0、1两个状态,只用到1位,而矩阵是int型,我们可以用一位来记录更新前的状态,用另一位来记录更新后的状态。

二、代码

class Solution {public void gameOfLife(int[][] board) {int n = board.length;int m = board[0].length;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {int cnt = 0;for(int x = - 1; x <= 1; x++) {for(int y = -1; y <= 1; y++) {// 枚举四面八方八个方向 防止越界if(i + x >= 0 && i + x < n && j + y >= 0 && j + y < m && !(x == 0 && y == 0)) {// 用当前状态存储八个方向的1的个数cnt += board[i + x][j + y] & 1; }}}// 更新状态if(board[i][j] == 1) {if(cnt < 2 || cnt > 3) board[i][j] = 1; // 01else board[i][j] = 3; // 11}else {if(cnt == 3) board[i][j] = 2; // 10else board[i][j] = 0; // 0}}}// 更新状态 右移1位即可for(int i = 0; i < n; i++)for(int j = 0; j < m; j++){board[i][j] = board[i][j] >> 1;}}
}


总结

通过二进制位运算的思想可以存储两个状态,用来避免更新对下面操作的影响。


http://www.mrgr.cn/news/48830.html

相关文章:

  • 从知乎神贴挖掘财富的思路分析
  • SpringCloud网关聚合knife4j方案
  • JAVA数组基础
  • Nginx UI 一个可以管理Nginx的图形化界面工具
  • 机器学习篇-day06-集成学习-随机森林 Adaboost GBDT XGBoost
  • Java数组的值拷贝和地址拷贝
  • 删除链表的倒数第 N 个结点 | LeetCode-19 | 双指针 | 递归 | 栈 | 四种方法
  • Java并发 - ReentrantLock
  • 手撕单例模式
  • 【笔记】shell基本使用,超全,更新ing
  • 0/1 背包问题详解
  • 从二维到三维,电商行业有哪些变化?
  • 获取UTF8编码文本长度, 检测符合UTF8编码
  • 云计算ftp 服务器实验
  • 量化交易理论:凯利公式和仓位管理
  • 如何选择安全的谷歌浏览器插件
  • 关于Linux下C++程序内存dump的分析和工具
  • Samtools手册中文版
  • FreeRTOS学习笔记(更新中更新时间2024.10.12)
  • 智能化时代,企业管理疑难杂症就问“中聚AI”