827.最大人工岛
思路一:深度优先遍历
- 1.深度优先遍历,求出所有岛屿的面积,并且把每个岛屿记上不同标记
- 2.使用 unordered_map 使用键值对,标记:面积,记录岛屿面积
- 3.遍历所有海面,然后进行一次广度优先遍历,使用 unordered_set 记录访问情况,同时通过 unordered_map 去连接相邻岛屿,更新最大面积情况
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
void dfs(vectorint>>& grid, vectorbool>>& visited, int x, int y, int mark) {
if (visited[x][y] || grid[x][y] == 0) return;
for (int i = 0; i < 4; i++) {
int nextx = x + dir[i][0];
int nexty = y + dir[i][1];
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
dfs(grid, visited, nextx, nexty, mark);
int largestIsland(vectorint>>& grid) {
int n = grid.size(), m = grid[0].size();
vectorbool>> visited = vectorbool>>(n, vector<bool>(m, false));
unordered_map<int ,int> gridNum;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 0) isAllGrid = false;
if (!visited[i][j] && grid[i][j] == 1) {
dfs(grid, visited, i, j, mark);
if (isAllGrid) return n * m;
unordered_set<int> visitedGrid;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k < 4; k++) {
int neari = i + dir[k][1];
int nearj = j + dir[k][0];
if (neari < 0 || neari >= grid.size() || nearj < 0 || nearj >= grid[0].size()) continue;
if (visitedGrid.count(grid[neari][nearj])) continue;
count += gridNum[grid[neari][nearj]];
visitedGrid.insert(grid[neari][nearj]);
result = max(result, count);

127.单词接龙
分析:
- 1.使用 unordered_set 加快查询速度
- 2.使用 unordered_map 记录查询的次数
- 3.使用队列去进行广度优先遍历
思路一:广度优先遍历
- 1.通过对 beginword 每一个单词的替换,寻找 set 中是否存在,存在即可以直接修改到达;
- 2.并且进行修改的次数记录,通过广度优先遍历,每次找出所有能到达的结果,只要找到 endword,必然是最短路径
int ladderLength(string beginWord, string endWord, vector& wordList) {
unordered_setset(wordList.begin(),wordList.end());
if(set.find(endWord)==set.end()) return 0;
for(int i=0;isize();i++){
if(newmid==endWord) return path+1;
if(set.find(newmid)!=set.end() && map.find(newmid)==map.end()){
841.钥匙和房间
分析:
- 1.使用 unordered_set 记录访问过的房间
- 2.使用 queue 进行广度优先遍历
思路一:广度优先遍历
- 从第 0 个房间开始遍历,获取钥匙放入 que ,然后记录遍历过的房间,将遍历过房间弹出队列
bool canVisitAllRooms(vectorint>>& rooms) {
if(set.find(keY)!=set.end()) continue;
for(int i=0;isize();i++) que.push(rooms[keY][i]);