首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
Bubble Sort - 冒泡排序
Selection Sort - 选择排序
Insertion Sort - 插入排序
Merge Sort - 归并排序
Quick Sort - 快速排序
Heap Sort - 堆排序
Bucket Sort
Counting Sort
两数之和
两数相加
无重复字符的最长子字符串
两个排序数组的中值
最长回文子串
锯齿形变换
反转整数
合并K个排序列表
链表循环
除Self之外的数组乘积
4的威力
蛙跳
将交叉口大小设置为至少两个
最大的块,使其分类
到达点
阶乘零点函数的前像大小
建造一个大的岛屿
唯一字母串
树的距离之和
猜词游戏
节点的最短路径
矩形区域II
K-相似字符串
雇佣K工人的最低成本
至少为K的最短子阵
获取所有key的最短路径
加油站的最小数量
有利可图的计划
细分图中的可达节点
超级蛋掉落
最大频率叠加
有序队列
DI序列的有效置换
猫和老鼠
最长不含重复字符的子字符串
丑数
第一个只出现一次的字符
字符流中第一个不重复的字符
两个链表的第一个公共结点
数字在排序数组中出现的次数
0到n-1中缺失的数字
数组中数值和下标相等的元素
二叉树的深度
数组中只出现一次的两个数字
数组中唯一只出现一次的数字
翻转单词顺序
左旋转字符串
滑动窗口的最大值
当前位置:
首页>>
技术小册>>
数据结构与算法(中)
小册名称:数据结构与算法(中)
难度: Hard 题意: 1. 给定一张矩阵图 2. 如果两个点相邻且都为1,这两个点连通 3. 至多把一个0改为1,问最大的连通岛的面积是多大 思路: - 看数据结构,横竖最大是50,整个图最多才2500个点,直接枚举所有的0,改成1之后做dfs判断连通图,都可以解决 - 两个连通岛其实是两个集合,如果将一个0改成1,意味着把上下左右所在的岛都合并在一个集合中,我们需要一个数据结构,既可以将集合合并,又可以判断某两个元素是否在同一个集合中,这种数据结构就是并查集 解法: ```java class Solution { private class Set { int[] s; int[] num; int r; int c; private Set(int r, int c) { this.r = r; this.c = c; this.s = new int[r * c]; this.num = new int[r * c]; for (int i = 0;i < this.s.length;i++) { this.s[i] = i; this.num[i] = 1; } } private int calIdx(int x, int y) { return x * c + y; } private int find(int idx) { if (this.s[idx] == idx) { return idx; } else { return this.s[idx] = find(this.s[idx]); } } private void merge(int x1, int y1, int x2, int y2) { int p1 = find(calIdx(x1, y1)); int p2 = find(calIdx(x2, y2)); if (p1 != p2) { this.s[p1] = p2; this.num[p2] += this.num[p1]; } } } public int largestIsland(int[][] grid) { int[] dx = new int[]{0,0,1,-1}; int[] dy = new int[]{1,-1,0,0}; Set set = new Set(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] == 0) { continue; } for (int k = 0;k < 4;k++) { if (i + dx[k] < 0 || i + dx[k] >= grid.length) { continue; } if (j + dy[k] < 0 || j + dy[k] >= grid[0].length) { continue; } if (grid[i + dx[k]][j + dy[k]] == 0) { continue; } set.merge(i, j, i + dx[k], j + dy[k]); } } } int max = 0; for (int i = 0;i < grid.length;i++) { for (int j = 0; j < grid[0].length; j++) { if (grid[i][j] == 1) { continue; } HashSet<Integer> t = new HashSet<>(); for (int k = 0;k < 4;k++) { if (i + dx[k] < 0 || i + dx[k] >= grid.length) { continue; } if (j + dy[k] < 0 || j + dy[k] >= grid[0].length) { continue; } if (grid[i + dx[k]][j + dy[k]] == 0) { continue; } t.add(set.find(set.calIdx(i + dx[k], j + dy[k]))); } int ret = 0; for (Integer p: t) { ret += set.num[p]; } ret ++; max = Math.max(ret, max); } } if (max == 0) { max = grid.length * grid[0].length; } return max; } } ```
上一篇:
阶乘零点函数的前像大小
下一篇:
唯一字母串
该分类下的相关小册推荐:
数据结构与算法(上)
编程之道-算法面试(上)
编程之道-算法面试(下)
算法面试通关 50 讲
数据结构与算法之美
业务开发实用算法精讲
数据结构与算法(下)