// 方向数组,便于dfs过程中确定下一个要求的点。 int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0};
int checkflag = 1;
classSolution { private: int n; int m; voiddfs1(int x,int y, vector<vector<int>>& grid1, int cnt) { // 标记。 vis1[x][y] = cnt; for (int i = 0; i < 4; i++) { int newx = x + dx[i]; int newy = y + dy[i]; if (newx >= 0 && newx < n && newy >= 0 && newy < m) { // 去相邻的,grid1不为0且vis1不为0(即没被访问过的)。 if (grid1[newx][newy] == 1 && !vis1[newx][newy]) dfs1(newx, newy, grid1, cnt); } } } voiddfs2(int x,int y, vector<vector<int>>& grid2, int cnt) { vis2[x][y] = cnt; // 这说明在grid2中是1,但是在grid1中为0,必然不是子岛屿,故返回。 if (vis1[x][y] == 0) checkflag = 0; for (int i = 0; i < 4; i++) { int newx = x + dx[i]; int newy = y + dy[i]; if (newx >= 0 && newx < n && newy >= 0 && newy < m) { if (grid2[newx][newy] == 1 && !vis2[newx][newy]) dfs2(newx, newy, grid2, cnt); } } }
public: intcountSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) { n = grid1.size(); m = grid1[0].size(); memset(vis1, 0, sizeof(vis1)); memset(vis2, 0, sizeof(vis1)); int count1 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // 对于每一个vis1不为0且grid1也不为零的点,dfs if (!vis1[i][j] && grid1[i][j] == 1) dfs1(i, j, grid1, ++count1); } } int Ans = 0; int count2 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!vis2[i][j] && grid2[i][j] == 1) { checkflag = 1; dfs2(i, j, grid2, ++count2); if (checkflag) Ans++; } } } return Ans; } };
D-查询差绝对值的最小值
从给定的$n$个数中任取两个不同的数,其之差的绝对值的最小值为这$n$个数的差绝对值的最小值。现在给你一个长度为$n$的数组$a$,和$m$个询问,每个询问给定一组$l, r$,要求出对于每个询问,区间$l,r$中数的差绝对值的最小值。($1 \le n \le 10^5$, $1 \le m \le 2\times 10^4$,$1 \le a[i] \le 100$)
classSolution { public: vector<int> minDifference(vector<int>& nums, vector<vector<int>>& queries) { for (int i = 0; i <= 100; i++) Count[i].clear(); int n = nums.size(); // 记录下每个数字出现的位置 for (int i = 0; i < n; i++) Count[nums[i]].push_back(i); Ans.clear(); int m = queries.size(); for (int i = 0; i < m; i++) { int l = queries[i][0], r = queries[i][1]; CompareA.clear(); for (int i = 1; i <= 100; i++) { if (Count[i].size() != 0) { int pos = lower_bound(Count[i].begin(), Count[i].end(), l) - Count[i].begin(); // 这说明数字i存在于[l,r]中 if (pos < Count[i].size()) { if (Count[i][pos] >= l && Count[i][pos] <= r) CompareA.push_back(i); } } } int ans = 0x3f3f3f3f; if (CompareA.size() == 1) ans = -1; for (int i = 1; i < CompareA.size(); i++) ans = min(ans, CompareA[i] - CompareA[i - 1]); Ans.push_back(ans); } return Ans; } };