LeetCode刷题21-连续出牌数量
![](https://img2022.cnblogs.com/blog/1322298/202208/1322298-20220808002301182-1579700352.png)
package exam; import java.util.*; public class Main04 { /* 说明 如果打(1, r)-> (5, r),那么能打两张。 如果打(4,y) -> (4, b) -> (3, b),那么能打三张。 思路分析 这道题还可以考虑BFS,相同数字或者相同颜色的都存入连续关系。 从第一个进如队列,统计每一个对应的最大次数,最后再更新最大值。 存入连续关系得时候可以使用二维list 以序号为索引,判断元素相同或颜色相同的都加入相应的list。 然后就是常规的BFS入队进行处理。 参考代码 */ public static void main(String[] args) { Scanner in = new Scanner(System.in); // 数字 String[] str1 = in.nextLine().split(" "); // 颜色 String[] str2 = in.nextLine().split(" "); String[][] arr = new String[str1.length][2]; // 2维数组存卡牌 存的代表列0-数字 列1-颜色 for (int i = 0; i < str1.length; i++) { arr[i][0] = str1[i]; arr[i][1] = str2[i]; } // 存储相等关系 List<List<Integer>> list = new ArrayList<>(arr.length); for (int i = 0; i < arr.length; i++) { // 初始化 list.add(new ArrayList<>()); } for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length; j++) { if (i != j) { if (arr[i][0].equals(arr[j][0]) || arr[i][1].equals(arr[j][1])) { list.get(i).add(j); } } } } // BFS Queue<Integer> queue = new ArrayDeque<>(); Queue<Integer> visited = new ArrayDeque<>(); // 用于判断是否访问过 int[] res = new int[arr.length]; Arrays.fill(res, 1); queue.add(0); while (!queue.isEmpty()) { int poll = queue.poll(); for (int node : list.get(poll)) { if (!visited.contains(node)) { visited.add(node); res[node] = res[poll] + 1; queue.add(node); } } } int ans = 0; for (int i = 0; i < arr.length; i++) { ans = Math.max(ans, res[i]); } System.out.println(ans); } }
本文来自博客园,作者:chch213,转载请注明原文链接:https://www.cnblogs.com/chch213/p/16560344.html