【672. 灯泡开关 Ⅱ】状态空间缩小
//只需要考虑前6位的状态,i这种状态和i+6这个状态是一样的
import java.util.ArrayDeque; import java.util.Arrays; import java.util.HashSet; class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.flipLights(3,2)); } public int flipLights(int n, int presses) { n = Math.min(n,6); char[] arr = new char[n]; for (int i = 0; i < n; i++) { arr[i] = '1'; } ArrayDeque<char[]> deque = new ArrayDeque<>(); deque.add(arr); int step = 0; while (!deque.isEmpty() && step < presses) { ArrayDeque<char[]> nextDeque = new ArrayDeque<>(); step++; HashSet<String> set = new HashSet<>(); while(!deque.isEmpty()){ char[] state = deque.poll(); char[] newState = new char[n]; for (int i = 0; i < n; i++) { newState[i] = state[i] == '1' ? '0' : '1'; } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 0; i < n; i++) { if (i % 2 == 1) { newState[i] = state[i]; } else { newState[i] = state[i] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 0; i < n; i++) { if (i % 2 == 0) { newState[i] = state[i]; } else { newState[i] = state[i] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } for (int i = 1; i <= n; i++) { if (i % 3 != 1) { newState[i - 1] = newState[i - 1]; } else { newState[i - 1] = newState[i - 1] == '1' ? '0' : '1'; } } if (!set.contains(new String(newState))) { set.add(new String(newState)); nextDeque.offer(Arrays.copyOf(newState,n)); } } deque = nextDeque; } return deque.size(); } }
本文作者:fishcanfly
本文链接:https://www.cnblogs.com/fishcanfly/p/16348941.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步