Leetcode 289. 生命游戏和Leetcode 452. 用最少数量的箭引爆气球

news/2024/9/23 17:24:35/

文章目录

  • Leetcode 289. 生命游戏
    • 题目描述
    • C语言题解和思路
      • 解题思路
  • Leetcode 452. 用最少数量的箭引爆气球
    • 题目描述
    • C语言题解和思路
      • 解题思路


Leetcode 289. 生命游戏

题目描述

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

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

如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

示例 1:

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

示例 2:

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

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 25
  • board[i][j] 为 0 或 1

进阶:

你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。

本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

C语言题解和思路

void gameOfLife(int** board, int boardSize, int* boardColSize) {int **table = (int **)malloc(sizeof(int *) * boardSize);int i, j;for(i = 0; i < boardSize; i++){table[i] = (int *)malloc(sizeof(int) * boardColSize[0]);memset(table[i], 0, sizeof(int) * boardColSize[0]);}for(i = 0; i < boardSize; i++){for(j = 0; j < boardColSize[0]; j++){if(i > 0){if(board[i - 1][j] == 1){table[i][j]++;}}if(i < boardSize - 1){if(board[i + 1][j] == 1){table[i][j]++;}}if(j > 0){if(board[i][j - 1] == 1){table[i][j]++;}}if(j < boardColSize[i] - 1){if(board[i][j + 1] == 1){table[i][j]++;}}if(i > 0 && j > 0){if(board[i - 1][j - 1] == 1){table[i][j]++;}}if(i > 0 && j < boardColSize[i] - 1){if(board[i - 1][j + 1] == 1){table[i][j]++;}}if(i < boardSize - 1 && j < boardColSize[0] - 1){if(board[i + 1][j + 1] == 1){table[i][j]++;}}if(j > 0 && i < boardSize - 1){if(board[i + 1][j - 1] == 1){table[i][j]++;}}}}for(i = 0; i < boardSize; i++){for(j = 0; j < boardColSize[0]; j++){if(board[i][j] == 0 && table[i][j] == 3){board[i][j] = 1;}else if(board[i][j] == 1 && (table[i][j] > 3 || table[i][j] < 2)){board[i][j] = 0;}}}
}

解题思路

创建一个与传入数组大小相等的数组,先将它全部初始化为 0 ,用来记录每个细胞周围活细胞的数量。

遍历数组 board ,判断某个细胞周围的活细胞数,注意要小心数组越界,将周围活细胞的数量记录到数组 table 对应的位置。

最后再遍历数组 board ,根据数组 table 对应的值判断该位置细胞的状态。

Leetcode 452. 用最少数量的箭引爆气球

题目描述

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

示例 1:

输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。

示例 2:

输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。

示例 3:

输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:

  • 在x = 2处发射箭,击破气球[1,2]和[2,3]。
  • 在x = 4处射出箭,击破气球[3,4]和[4,5]。

提示:

  • 1 <= points.length <= 10^5
  • points[i].length == 2
  • -2 ^31 <= xstart < xend <= 2 ^31 - 1

C语言题解和思路

int cmp(int *A, int *B)
{int *a = *(int **)A;int *b = *(int **)B;return a[1] > b[1] ? 1 : -1;
}
int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){if(pointsSize == 0){return 0;}qsort(points, pointsSize, sizeof(int *), cmp);int rec = points[0][1];int c = 1;for(int i = 1; i < pointsSize; i++){if(points[i][0] > rec){rec = points[i][1];c++;}}return c;
}

解题思路

快速排序 + 贪心算法

首先判断数组区间的个数,如果个数为 0 ,直接返回 0 。

根据数组中的 xend 进行快速排序。

将记录需要箭的最小数量初始化为 1 ,让变量 rec 记录第一个区间的结束值。

从第二个区间开始遍历数组,如果该区间的起始值大于 rec 的值, c 加一并将 rec 更新为当前区间的结束值。

循环结束后,返回 c 。


http://www.ppmy.cn/news/1431959.html

相关文章

利用技术优化医保购药体验:开发医保购药APP

为了解决线下医保买药繁琐的流程&#xff0c;利用技术优化医保购药体验成为了当务之急。因此&#xff0c;今天小编将为大家详解如何开发一款医保购药APP。 一、背景与意义 购药流程繁琐、耗时、信息不透明等问题日益凸显&#xff0c;亟需一种新的解决方案。开发医保购药APP可以…

2.微服务技术

微服务技术对比 DubboSpringCloudSpringCloudAlibaba注册中心zookeeper&#xff0c;RedisEureka,ConsulNacos,Eureka服务远程调用Dubbo协议Feign(http协议)Dubbo,Feign配置中心SpringCloudConfigSpringCloudConfig,Nacos服务网关SpringCloudGateway,ZuulSpringCloudGateway,Zu…

IP地址怎么实现https

IP可以申请SSL证书。可以解决企业需要对IP实现https加密的需求&#xff0c;一张证书可以支持同时绑定多个IP。 IP证书有两种级别&#xff1a;基础级IP SSL证书和标准企业级IP SSL证书。 基础型SSL证书只需要10-30分钟即可颁发&#xff0c;企业型需要1-3个工作日即可颁发。 企…

【机器学习】机器学习学习笔记 - 监督学习 - 多项式回归决策树回归 - 03

多项式回归 解决线性回归的准备性不足问题(线性回归只能是直线&#xff0c;多项式回归引入多项式可以是曲线)通过对预测值进行多项式转换, 使得回归模型可以是非线性的多项式回归的优点是可以处理非线性的数据多项式回归的缺点是它对数据进行了多项式转换 pdf在线免费转word文…

互联网大厂ssp面经,数据结构:part1

1. 数组和链表的区别是什么&#xff1f; a. 数组是一种线性数据结构&#xff0c;存储在连续的内存块中&#xff0c;元素可以通过索引直接访问。 b. 链表是由节点组成的数据结构&#xff0c;每个节点包含数据和指向下一个节点的指针。 2. 数组和链表的的优缺点是什么&#xff…

【Linux学习】初始冯诺漫体系结构

文章目录 认识冯诺依曼系统 认识冯诺依曼系统 什么是冯诺依曼体系结构&#xff1f; 冯诺依曼体系结构是一种将程序指令和数据以二进制形式存放在主存储器中&#xff0c;由中央处理器统一控制和执行的计算机系统结构。冯诺依曼体系结构实现了程序的可编程性和硬件与软件的分离&…

量子密钥分发系统设计与实现(一):系统基本架构讨论

经过一段时间讨论&#xff0c;我们了解到量子密钥分发设备是当前量子保密通信系统的基础。从本文开始&#xff0c;我将开启量子密钥分发系统设计与实现系列&#xff0c;详细讨论量子密钥分发设备如何从0到1的搭建。 1.QKD系统总体讨论 QKD系统的核心功能就是为通信双方提供理论…

LLM 编码的过程

句子 》句子预处理 (把太长的句子截短,在句子中添加首尾标识符)》分词 》编码(词典 vocabulary) tokenizer.encode 参与了 step 1、2、3 transformer 参与了 step 4、5、6、7 LLM 编码的过程 LLM(大型语言模型)编码是将输入文本转换为神经网络可以处理的数字表示的过…