|
74 | 74 |
|
75 | 75 | <!-- 这里可写通用的实现逻辑 -->
|
76 | 76 |
|
| 77 | +题目性质:假设祖先节点为 x ,后代节点为 y ,则 x 在 pairs 中的出现次数一定大于等于 y 在 pairs 中的出现次数,且当等号成立时 x、y 可互换位置。 |
| 78 | + |
| 79 | +思路: |
| 80 | + |
| 81 | +1. 用邻接矩阵、邻接表存放 pairs。 |
| 82 | +1. 将树中所有节点 nodes 按照出现的次数升序排列。设置 equal 标志,用来记录是否出现“次数相同”的祖孙节点,root 用来记录没有父节点的节点数。 |
| 83 | +1. 遍历每个节点 `nodes[i]`(记为 x),找出出现次数大于 x 的节点 y。如果 x 跟 y 构成祖孙关系,那么 y 的邻居 z 也需要构成祖孙关系。否则直接返回 0。 |
| 84 | + |
| 85 | +遍历结束,判断 root 的个数,若大于 1,说明不满足只有一个根节点,返回 0。若 equal 为真,说明存在可互换祖孙关系的节点对,返回 2;否则返回 1。 |
| 86 | + |
77 | 87 | <!-- tabs:start -->
|
78 | 88 |
|
79 | 89 | ### **Python3**
|
80 | 90 |
|
81 | 91 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
82 | 92 |
|
83 | 93 | ```python
|
84 |
| - |
| 94 | +class Solution: |
| 95 | + def checkWays(self, pairs: List[List[int]]) -> int: |
| 96 | + g = [[False] * 510 for _ in range(510)] |
| 97 | + v = defaultdict(list) |
| 98 | + for x, y in pairs: |
| 99 | + g[x][y] = g[y][x] = True |
| 100 | + v[x].append(y) |
| 101 | + v[y].append(x) |
| 102 | + nodes = [] |
| 103 | + for i in range(510): |
| 104 | + if v[i]: |
| 105 | + nodes.append(i) |
| 106 | + g[i][i] = True |
| 107 | + nodes.sort(key=lambda x: len(v[x])) |
| 108 | + equal = False |
| 109 | + root = 0 |
| 110 | + for i, x in enumerate(nodes): |
| 111 | + j = i + 1 |
| 112 | + while j < len(nodes) and not g[x][nodes[j]]: |
| 113 | + j += 1 |
| 114 | + if j < len(nodes): |
| 115 | + y = nodes[j] |
| 116 | + if len(v[x]) == len(v[y]): |
| 117 | + equal = True |
| 118 | + for z in v[x]: |
| 119 | + if not g[y][z]: |
| 120 | + return 0 |
| 121 | + else: |
| 122 | + root += 1 |
| 123 | + if root > 1: |
| 124 | + return 0 |
| 125 | + return 2 if equal else 1 |
85 | 126 | ```
|
86 | 127 |
|
87 | 128 | ### **Java**
|
88 | 129 |
|
89 | 130 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
90 | 131 |
|
91 | 132 | ```java
|
| 133 | +class Solution { |
| 134 | + public int checkWays(int[][] pairs) { |
| 135 | + boolean[][] g = new boolean[510][510]; |
| 136 | + List<Integer>[] v = new List[510]; |
| 137 | + for (int i = 0; i < 510; ++i) { |
| 138 | + v[i] = new ArrayList<>(); |
| 139 | + } |
| 140 | + for (int[] p : pairs) { |
| 141 | + int x = p[0], y = p[1]; |
| 142 | + g[x][y] = true; |
| 143 | + g[y][x] = true; |
| 144 | + v[x].add(y); |
| 145 | + v[y].add(x); |
| 146 | + } |
| 147 | + List<Integer> nodes = new ArrayList<>(); |
| 148 | + for (int i = 0; i < 510; ++i) { |
| 149 | + if (!v[i].isEmpty()) { |
| 150 | + nodes.add(i); |
| 151 | + g[i][i] = true; |
| 152 | + } |
| 153 | + } |
| 154 | + nodes.sort(Comparator.comparingInt(a -> v[a].size())); |
| 155 | + boolean equal = false; |
| 156 | + int root = 0; |
| 157 | + for (int i = 0; i < nodes.size(); ++i) { |
| 158 | + int x = nodes.get(i); |
| 159 | + int j = i + 1; |
| 160 | + for (; j < nodes.size() && !g[x][nodes.get(j)]; ++j); |
| 161 | + if (j < nodes.size()) { |
| 162 | + int y = nodes.get(j); |
| 163 | + if (v[x].size() == v[y].size()) { |
| 164 | + equal = true; |
| 165 | + } |
| 166 | + for (int z : v[x]) { |
| 167 | + if (!g[y][z]) { |
| 168 | + return 0; |
| 169 | + } |
| 170 | + } |
| 171 | + } else { |
| 172 | + ++root; |
| 173 | + } |
| 174 | + } |
| 175 | + if (root > 1) { |
| 176 | + return 0; |
| 177 | + } |
| 178 | + return equal ? 2 : 1; |
| 179 | + } |
| 180 | +} |
| 181 | +``` |
| 182 | + |
| 183 | +### **C++** |
| 184 | + |
| 185 | +```cpp |
| 186 | +class Solution { |
| 187 | +public: |
| 188 | + int checkWays(vector<vector<int>>& pairs) { |
| 189 | + vector<vector<bool>> g(510, vector<bool>(510)); |
| 190 | + vector<vector<int>> v(510); |
| 191 | + for (auto& p : pairs) |
| 192 | + { |
| 193 | + int x = p[0], y = p[1]; |
| 194 | + g[x][y] = g[y][x] = 1; |
| 195 | + v[x].push_back(y); |
| 196 | + v[y].push_back(x); |
| 197 | + } |
| 198 | + vector<int> nodes; |
| 199 | + for (int i = 1; i <= 500; ++i) |
| 200 | + { |
| 201 | + if (v[i].size()) |
| 202 | + { |
| 203 | + nodes.push_back(i); |
| 204 | + g[i][i] = 1; |
| 205 | + } |
| 206 | + } |
| 207 | + sort(nodes.begin(), nodes.end(), [&](int x, int y)->bool{return v[x].size() < v[y].size();}); |
| 208 | + bool equal = 0; |
| 209 | + int root = 0; |
| 210 | + for (int i = 0; i < nodes.size(); ++i) |
| 211 | + { |
| 212 | + int x = nodes[i]; |
| 213 | + int j = i + 1; |
| 214 | + for (; j < nodes.size() && !g[x][nodes[j]]; ++j); |
| 215 | + if (j < nodes.size()) |
| 216 | + { |
| 217 | + int y = nodes[j]; |
| 218 | + if (v[x].size() == v[y].size()) equal = 1; |
| 219 | + for (int z : v[x]) |
| 220 | + if (!g[y][z]) |
| 221 | + return 0; |
| 222 | + } |
| 223 | + else ++root; |
| 224 | + } |
| 225 | + if (root > 1) return 0; |
| 226 | + if (equal) return 2; |
| 227 | + return 1; |
| 228 | + } |
| 229 | +}; |
| 230 | +``` |
92 | 231 |
|
| 232 | +### **Go** |
| 233 | +
|
| 234 | +```go |
| 235 | +func checkWays(pairs [][]int) int { |
| 236 | + g := make([][]bool, 510) |
| 237 | + v := make([][]int, 510) |
| 238 | + for i := range g { |
| 239 | + g[i] = make([]bool, 510) |
| 240 | + } |
| 241 | + for _, p := range pairs { |
| 242 | + x, y := p[0], p[1] |
| 243 | + g[x][y] = true |
| 244 | + g[y][x] = true |
| 245 | + v[x] = append(v[x], y) |
| 246 | + v[y] = append(v[y], x) |
| 247 | + } |
| 248 | + var nodes []int |
| 249 | + for i := 1; i <= 500; i++ { |
| 250 | + if len(v[i]) > 0 { |
| 251 | + nodes = append(nodes, i) |
| 252 | + g[i][i] = true |
| 253 | + } |
| 254 | + } |
| 255 | + sort.Slice(nodes, func(i, j int) bool { |
| 256 | + return len(v[nodes[i]]) < len(v[nodes[j]]) |
| 257 | + }) |
| 258 | + equal := false |
| 259 | + root := 0 |
| 260 | + for i, x := range nodes { |
| 261 | + j := i + 1 |
| 262 | + for ; j < len(nodes) && !g[x][nodes[j]]; j++ { |
| 263 | + } |
| 264 | + if j < len(nodes) { |
| 265 | + y := nodes[j] |
| 266 | + if len(v[x]) == len(v[y]) { |
| 267 | + equal = true |
| 268 | + } |
| 269 | + for _, z := range v[x] { |
| 270 | + if !g[y][z] { |
| 271 | + return 0 |
| 272 | + } |
| 273 | + } |
| 274 | + } else { |
| 275 | + root++ |
| 276 | + } |
| 277 | + } |
| 278 | + if root > 1 { |
| 279 | + return 0 |
| 280 | + } |
| 281 | + if equal { |
| 282 | + return 2 |
| 283 | + } |
| 284 | + return 1 |
| 285 | +} |
93 | 286 | ```
|
94 | 287 |
|
95 | 288 | ### **...**
|
|
0 commit comments