1> The transformations form a cycle.
2>The original array that is passed in, is not a part of that cycle.
Here's a generalizable way to approach this problem w/o having to have a ton of insight:
In the future when you see questions where you have to make a large amount of state transitions over a state space that seems small, just compare the size of the state space to the # of transitions to determine if there's a cycle so you can bound complexity to the size of the state space.
Copy [1,0,0,1,0,0,1,0] => original
[0, 0, 0, 1, 0, 0, 1, 0] => next
[0, 1, 0, 1, 0, 0, 1, 0]
[0, 1, 1, 1, 0, 0, 1, 0]
[0, 0, 1, 0, 0, 0, 1, 0]
[0, 0, 1, 0, 1, 0, 1, 0]
[0, 0, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 1, 1, 1, 0, 0]
[0, 1, 0, 0, 1, 0, 0, 0]
[0, 1, 0, 0, 1, 0, 1, 0]
[0, 1, 0, 0, 1, 1, 1, 0]
[0, 1, 0, 0, 0, 1, 0, 0]
[0, 1, 0, 1, 0, 1, 0, 0]
[0, 1, 1, 1, 1, 1, 0, 0]
[0, 0, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 1, 0] => cycle!
cycle = 14
Copy class Solution {
public int[] prisonAfterNDays(int[] cells, int n) {
int cycle = 0;
boolean hasCycle = false;
Set<String> set = new HashSet<>();
for (int i = 0; i < n; i++) {
int[] next = helper(cells);
String cellStr = Arrays.toString(next);
if (!set.contains(cellStr)) {
set.add(cellStr);
cycle++;
} else {
hasCycle = true;
break;
}
cells = next;
}
if (hasCycle) {
n %= cycle;
for (int i = 0; i < n; i++) {
cells = helper(cells);
}
}
// every time has a new array
return cells;
}
private int[] helper(int[] cells) {
int[] newCell = new int[cells.length];
newCell[0] = 0;
newCell[cells.length-1] = 0;
for (int i = 1; i < cells.length - 1; i++) {
if (cells[i-1] == cells[i+1]) {
newCell[i] = 1;
} else {
newCell[i] = 0;
}
}
return newCell;
}
}
/*
[0, 1, 0, 1, 1, 0, 0, 1]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[0, 1, 0, 1, 1, 0, 0, 1]
[0, 1, 0, 1, 1, 0, 0, 1]
*/