wordpress开启缩略图,四川最好的网络优化公司,前端开发面试题及答案,美工设计1042. 不邻接植花
难度中等198
有 n 个花园#xff0c;按从 1 到 n 标记。另有数组 paths #xff0c;其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中#xff0c;你打算种下四种花之一。
另外#xff0c;所有花园 最多 有 3 条路径可以进入…1042. 不邻接植花
难度中等198
有 n 个花园按从 1 到 n 标记。另有数组 paths 其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中你打算种下四种花之一。
另外所有花园 最多 有 3 条路径可以进入或离开.
你需要为每个花园选择一种花使得通过路径相连的任何两个花园中的花的种类互不相同。
以数组形式返回 任一 可行的方案作为答案 answer其中 answer[i] 为在第 (i1) 个花园中种植的花的种类。花的种类用 1、2、3、4 表示。保证存在答案。
示例 1
输入n 3, paths [[1,2],[2,3],[3,1]]
输出[1,2,3]
解释
花园 1 和 2 花的种类不同。
花园 2 和 3 花的种类不同。
花园 3 和 1 花的种类不同。
因此[1,2,3] 是一个满足题意的答案。其他满足题意的答案有 [1,2,4]、[1,4,2] 和 [3,2,1]示例 2
输入n 4, paths [[1,2],[3,4]]
输出[1,2,1,2]示例 3
输入n 4, paths [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
输出[1,2,3,4]提示
1 n 1040 paths.length 2 * 104paths[i].length 21 xi, yi nxi ! yi每个花园 最多 有 3 条路径可以进入或离开
哈希表实现染色法 题解https://leetcode.cn/problems/flower-planting-with-no-adjacent/solution/liang-chong-xie-fa-ha-xi-biao-shu-zu-wei-7hm8/ 四色定理世界近代三大数学难题之一又称四色猜想、四色问题是世界三大数学猜想之一。 四色问题的内容是“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”也就是说在不引起混淆的情况下一张地图只需四种颜色来标记就行。 用数学语言表示即“将平面任意地细分为不相重叠的区域每一个区域总可以用1234这四个数字之一来标记而不会使相邻的两个区域得到相同的数字。”这里所指的相邻区域是指有一整段边界是公共的。如果两个区域只相遇于一点或有限多点就不叫相邻的。 问题相当于用 4 种颜色给图中的每个节点染色要求相邻节点颜色不同。而「所有花园最多有 3 条路径可以进入或离开」这相当于图中每个点的度数至多为 3那么只要选一个和邻居不同的颜色即可。
class Solution {public int[] gardenNoAdj(int n, int[][] paths) {ListInteger g[] new ArrayList[n];Arrays.setAll(g, e - new ArrayList());for(int[] e : paths){int x e[0]-1, y e[1]-1; // 编号改为从0开始g[x].add(y);g[y].add(x);}int[] color new int[n];for(int i 0; i n; i){// 至多有4种颜色每个节点至多3个路径// 因此只要选与邻居不同的颜色即可boolean[] used new boolean[5];for(int j : g[i]){used[color[j]] true;}while(used[color[i]]); // 找到一个邻居没有用过的颜色// for color[i]; used[color[i]]; color[i] {}}return color;}
}位运算实现
class Solution {public int[] gardenNoAdj(int n, int[][] paths) {ListInteger g[] new ArrayList[n];Arrays.setAll(g, e - new ArrayList());for(int[] e : paths){int x e[0]-1, y e[1]-1; // 编号改为从0开始g[x].add(y);g[y].add(x);}int[] color new int[n];for(int i 0; i n; i){int mask 1; // 由于颜色是 1~4把 0 加入 mask 保证下面不会算出 0for(int j : g[i]){mask | 1 color[j];}color[i] Integer.numberOfTrailingZeros(~mask);// 一个数与它的相反数与运算-1可以得到末尾0的个数}return color;}
}