题目:
![](https://img-blog.csdnimg.cn/07ce286b259b43448dee036aaa340a5d.png)
思路:
找规律,这里很明显说只要返回其中一个就行,那么一般都是找规律的题了,根据条件,可以知道,每次D就拿剩余的最大数,I拿剩余的最小数。如此肯定满足条件!
![](https://img-blog.csdnimg.cn/4295bd7168c340c58f4e5b1560659e2d.png)
?具体代码:
class Solution {
public int[] diStringMatch(String s) {
int n = s.length(), lo = 0, hi = n;
int[] perm = new int[n + 1];
for (int i = 0; i < n; ++i) {
//每次拿剩余的最大/最小
perm[i] = s.charAt(i) == 'I' ? lo++ : hi--;
}
// 最后剩下一个数,此时 lo == hi
perm[n] = lo;
return perm;
}
}
??其他题目:
![](https://img-blog.csdnimg.cn/4d580f49443d4d19ad9c4dba360a4367.png)
?思路:
使用dfs/bfs或者并查集都行,dfs的思路:对每一行长度【也就是有多少个城市】进行入口进行遍历,然后dfs函数里面对他有关联的城市筛选出来。
并查集思路:
![](https://img-blog.csdnimg.cn/3afad45e2eae420681dd00230371760b.png)
代码:
//使用dfs
class Solution {
public int findCircleNum(int[][] isConnected) {
int cities = isConnected.length;
boolean[] visited = new boolean[cities];
int provinces = 0;
for (int i = 0; i < cities; i++) {
if (!visited[i]) {
dfs(isConnected, visited, cities, i);
provinces++;
}
}
return provinces;
}
public void dfs(int[][] isConnected, boolean[] visited, int cities, int i) {
for (int j = 0; j < cities; j++) {
if (isConnected[i][j] == 1 && !visited[j]) {
visited[j] = true;
dfs(isConnected, visited, cities, j);
}
}
}
}
//使用并查集
class Solution {
int[] p = new int[200];
int find(int x){
if(x != p[x]) p[x] = find(p[x]);
return p[x];
}
void union(int x, int y){
p[find(x)] = find(y);
}
public int findCircleNum(int[][] isConnected) {
int n = isConnected.length;
for(int i = 0; i < n; i++) p[i] = i;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(isConnected[i][j] == 1) union(i, j);
}
}
int res = 0;
for(int i = 0; i < n; i++){
if(p[i] == i) res++;
}
return res;
}
}
补充:如果想练手bfs/dfs可以做一做:
剑指 Offer 32 - I. 从上到下打印二叉树 https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/
?使用bfs的效果:
![](https://img-blog.csdnimg.cn/9612c995d3924cebb58faca978484c67.png)
?
|