Middle-题目80:200. Number of Islands

本文介绍了一种使用深度优先搜索(DFS)算法解决岛屿计数问题的方法。通过遍历矩阵,将相连的1(岛屿)标记为已访问,并计算独立岛屿的数量。此算法同样适用于计算机图形学中的颜色填充。
部署运行你感兴趣的模型镜像

题目原文:
Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
11110
11010
11000
00000
Answer: 1
Example 2:
11000
11000
00100
00011
Answer: 3
题目大意:
给出一个矩阵,其中1代表岛,0代表海水,求出有几个岛。
题目分析:
本题是一个标准的不能再标准的dfs问题,从一个未访问的“岛”点开始从四个方向搜索,遇到“海水”或者矩阵边界就退出。
源码:(language:java)

public class Solution {
    public int numIslands(char[][] grid) {
        if (grid.length==0 || grid[0].length==0) 
            return 0;
        int count = 0;
        boolean[][] visited = new boolean[grid.length][grid[0].length];
        for (int i=0; i<grid.length; i++) {
            for (int j=0; j<grid[0].length; j++) {
                if (grid[i][j]=='1' && !visited[i][j]) { 
                    count++;
                    dfs(grid, visited, i, j);
                }
            }
        }
        return count;
    }

    private void dfs(char[][] grid, boolean[][] visited, int row, int col) {
        if (row<0 || row>=grid.length || col<0 || col>=grid[0].length || visited[row][col] || grid[row][col]=='0') // grid[i][j] is out of range
            return; 
        visited[row][col] = true;
        dfs(grid, visited, row-1, col);
        dfs(grid, visited, row+1, col);
        dfs(grid, visited, row, col-1);
        dfs(grid, visited, row, col+1);
    }
}

成绩:
5ms,beats 25.10%,众数3ms,40.17%
Cmershen的碎碎念:
其实本题的算法也适用于计算机图形学中的“颜色填充算法”,其原理一模一样。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think> 我们需要解析这个时间字符串:2025-11-14T02:00:00.000+1400 这个字符串是ISO 8601格式,但偏移量是+1400,表示比UTC早14小时(即UTC+14:00) 我们可以使用Python的datetime模块来解析这个字符串,但注意标准库的datetime可能不能直接解析这种格式(特别是偏移量部分没有冒号分隔)。 我们可以使用两种方法: 1. 使用第三方库dateutil(可以解析多种日期格式) 2. 手动处理字符串,将其转换为标准格式(例如,在偏移量中加上冒号,变成+14:00),然后使用datetime.fromisoformat(Python 3.7+)或者使用strptime。 这里我们提供两种方法: 方法一:使用dateutil.parser(推荐,因为它更灵活) 方法二:使用字符串处理并利用datetime.datetime.fromisoformat(需要调整字符串格式) 首先,我们使用方法一: 安装:pip install python-dateutil 方法二:我们可以将字符串中的+1400替换为+14:00,然后使用fromisoformat(Python 3.7+支持) 注意:原始字符串为:2025-11-14T02:00:00.000+1400 我们想要变成:2025-11-14T02:00:00.000+14:00 但是,如果使用strptime,我们可以指定格式,但格式中时区部分没有冒号,所以我们可以用自定义格式解析。 自定义格式:%Y-%m-%dT%H:%M:%S.%f%z 但是注意:%z可以解析的字符串形式是±HHMM[SS[.ffffff]](注意没有冒号),所以我们可以直接使用这个格式。 然而,在Python中,%z支持的格式是±HHMM,所以+1400是符合的。但是,注意原字符串中的毫秒部分有小数点,所以我们需要将毫秒部分也解析出来。 因此,完整的格式为:%Y-%m-%dT%H:%M:%S.%f%z 但是,注意:在Python 3.7及以上,strptime可以解析这样的字符串。在更早的版本中可能会有问题。 考虑到兼容性,我们使用两种方法。 这里我们给出两种方法的代码。 方法一:使用dateutil.parser 方法二:使用datetime.strptime(需要Python3.7+,因为早期版本中%z可能不能解析这种格式,或者行为不一致) 由于问题中没有指定Python版本,我们假设使用较新的Python(>=3.7)。 我们分别展示: 方法一(dateutil): ```python from dateutil import parser date_str = "2025-11-14T02:00:00.000+1400" dt = parser.isoparse(date_str) # 或者使用parser.parse(date_str) # 注意:isoparse是专门解析ISO格式的,但是dateutil的parser.parse也可以解析,但更通用,可能会解析更多格式。 # 但是,isoparse在dateutil 2.7.0版本后可用。如果版本较低,可以使用parser.parse。 # 或者使用: # dt = parser.parse(date_str) print(dt) ``` 方法二(标准库): ```python from datetime import datetime date_str = "2025-11-14T02:00:00.000+1400" # 格式字符串 fmt = "%Y-%m-%dT%H:%M:%S.%f%z" dt = datetime.strptime(date_str, fmt) print(dt) ``` 但是,方法二在Python3.7及以上可以运行,但在Python3.6中,%z可能无法解析不带冒号的时区(或者行为不一致)。所以如果考虑兼容性,方法一更好。 另外,我们也可以先将字符串转换为带冒号的时区,然后使用fromisoformat(因为ISO格式要求时区偏移量要有冒号): 例如:将+1400替换为+14:00,然后使用datetime.fromisoformat 方法三: ```python def convert_timezone_offset(s): # 找到时区符号的位置 # 从倒数第5位开始有5个字符(符号+4位数字)或者如果是负数也是5个字符(但这里我们字符串是+1400,所以是正数) # 我们可以在最后5个字符前插入冒号 if s[-5] in ('+', '-'): return s[:-5] + s[-5:] # 但是这样没有冒号,所以我们在倒数第2位前插入冒号 # 或者更一般的情况,如果时区部分有4位数字,我们就在中间加冒号 # 但是注意,字符串可能以时区结束,我们找到最后5个字符(符号+4位数字) # 另一种简单方法:将最后4位数字分成两个两个,然后加上冒号 if len(s) >= 5 and s[-5] in ('+', '-'): sign = s[-5] hours = s[-4:-2] minutes = s[-2:] return s[:-5] + sign + hours + ':' + minutes else: # 如果没有时区信息,直接返回 return s date_str = "2025-11-14T02:00:00.000+1400" new_date_str = convert_timezone_offset(date_str) # 转换后为:'2025-11-14T02:00:00.000+14:00' dt = datetime.fromisoformat(new_date_str) print(dt) ``` 但是,方法三需要手动处理字符串,而且fromisoformat在Python3.7+才支持。 因此,我们推荐方法一,因为dateutil.parser更强大。 如果不想安装第三方库,并且使用Python3.7+,那么方法二也可以。 现在,我们给出完整的代码示例(方法一和方法二),并解释。 注意:解析后的datetime对象将包含时区信息(tzinfo为datetime.timezone对象,偏移量为14小时)。 示例代码: 方法一(使用dateutil.parser): ```python from dateutil import parser date_str = "2025-11-14T02:00:00.000+1400" dt = parser.isoparse(date_str) # 这个方法在dateutil 2.7.0及以上可用 # 如果版本较低,可以使用: # dt = parser.parse(date_str) print("解析后的时间 (方法一):", dt) print("时区偏移量:", dt.utcoffset()) ``` 方法二(使用标准库,仅适用于Python3.7+): ```python from datetime import datetime date_str = "2025-11-14T02:00:00.000+1400" fmt = "%Y-%m-%dT%H:%M:%S.%f%z" dt = datetime.strptime(date_str, fmt) print("解析后的时间 (方法二):", dt) print("时区偏移量:", dt.utcoffset()) ``` 说明: 1. 两种方法都能正确解析时间字符串。 2. 解析后的对象都是带有时区信息的datetime对象。 3. 时区偏移量是14小时(即50400秒)。 注意:方法二在Python3.6及以下版本可能无法正常工作(会抛出异常)。如果使用Python3.6,建议使用方法一。 输出示例: ``` 解析后的时间 (方法一): 2025-11-14 02:00:00+14:00 时区偏移量: 14:00:00 解析后的时间 (方法二): 2025-11-14 02:00:00+14:00 时区偏移量: 14:00:00 ``` 时区偏移量是14小时,表示这个时间比UTC时间早14小时。所以,当UTC时间是2025-11-13 12:00:00时,这个时区的时间就是2025-11-14 02:00:00。 另外,我们还可以将这个时间转换为UTC时间: ```python utc_time = dt.astimezone(datetime.timezone.utc) print("对应的UTC时间:", utc_time) ``` 对于方法一解析的对象,可以直接使用astimezone转换。对于方法二解析的对象,也可以,因为strptime解析出来的tzinfo是datetime.timezone对象(固定偏移)。 注意:方法二解析出来的时区信息是datetime.timezone(datetime.timedelta(seconds=50400))。 最后,我们给出完整的代码示例(包含转换UTC时间)。 完整代码(方法一): ```python from dateutil import parser from datetime import datetime, timezone date_str = "2025-11-14T02:00:00.000+1400" dt = parser.isoparse(date_str) # 或者使用 parser.parse(date_str) print("解析后的时间:", dt) print("时区偏移量:", dt.utcoffset()) # 转换为UTC时间 utc_time = dt.astimezone(timezone.utc) print("对应的UTC时间:", utc_time) ``` 完整代码(方法二,Python3.7+): ```python from datetime import datetime, timezone, timedelta date_str = "2025-11-14T02:00:00.000+1400" fmt = "%Y-%m-%dT%H:%M:%S.%f%z" dt = datetime.strptime(date_str, fmt) print("解析后的时间:", dt) print("时区偏移量:", dt.utcoffset()) # 转换为UTC时间 utc_time = dt.astimezone(timezone.utc) print("对应的UTC时间:", utc_time) ``` 输出: ``` 解析后的时间: 2025-11-14 02:00:00+14:00 时区偏移量: 14:00:00 对应的UTC时间: 2025-11-13 12:00:00+00:00 ``` 因此,这个时间对应的UTC时间是2025年11月13日12点。 相关问题: </think> ### 解析时间字符串 `2025-11-14T02:00:00.000+1400` 这个时间字符串是 ISO 8601 格式,包含以下重要信息: - 日期和时间:2025年11月14日 02:00:00.000 - 时区偏移量:`+1400` 表示 **UTC+14:00**(比 UTC 快14小时) 以下是完整的解析代码和解释: ```python from datetime import datetime, timedelta, timezone # 原始时间字符串 time_str = "2025-11-14T02:00:00.000+1400" # 方法1:使用datetime.fromisoformat (Python 3.7+) # 注意:需要先将+1400转换为+14:00格式 formatted_str = time_str[:-2] + ":" + time_str[-2:] dt = datetime.fromisoformat(formatted_str) # 方法2:手动解析(兼容旧版本Python) def parse_custom_time(time_str): # 分离时间和时区部分 base, offset_str = time_str[:-5], time_str[-5:] # 解析基础时间 dt_base = datetime.strptime(base, "%Y-%m-%dT%H:%M:%S.%f") # 解析时区偏移(小时和分钟) sign = 1 if offset_str[0] == '+' else -1 hours = int(offset_str[1:3]) minutes = int(offset_str[3:5]) offset = sign * (hours * 60 + minutes) # 总分钟数 # 创建带有时区信息的时间对象 return dt_base.replace(tzinfo=timezone(timedelta(minutes=offset))) # 使用手动解析方法 dt_manual = parse_custom_time(time_str) # 输出结果 print(f"ISO格式解析: {dt} | 时区: {dt.tzinfo}") print(f"手动解析: {dt_manual} | 时区: {dt_manual.tzinfo}") print(f"UTC时间: {dt.astimezone(timezone.utc)}") ``` #### 代码解释: 1. **ISO格式解析**: - 使用 `fromisoformat()` 方法直接解析ISO时间字符串 - 需要先将 `+1400` 转换为标准格式 `+14:00` 2. **手动解析方法**: - 分离基础时间和时区偏移部分 - 使用 `strptime` 解析日期时间 - 计算时区偏移量(分钟) - 创建带有时区信息的 `datetime` 对象 3. **时区转换**: - `astimezone(timezone.utc)` 将时间转换为UTC #### 输出结果: ``` ISO格式解析: 2025-11-14 02:00:00+14:00 | 时区: UTC+14:00 手动解析: 2025-11-14 02:00:00+14:00 | 时区: UTC+14:00 UTC时间: 2025-11-13 12:00:00+00:00 ``` ### 关键信息: 1. **UTC+14:00 时区**: - 比UTC快14小时 - 地球最东端的时区(国际日期变更线以东) - 使用地区:基里巴斯(Line Islands)、萨摩亚等 2. **日期变更现象**: - 当UTC+14是11月14日02:00时 - UTC时间是11月13日12:00(相差1天) 3. **夏令时影响**: - UTC+14:00 通常是固定时区,不受夏令时影响 - 但某些地区(如萨摩亚)历史上曾调整过时区 ### 时区图例: ``` 国际日期变更线 | | UTC+14:00 (最早) | UTC-12:00 (最晚) | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值