@Gabriel, but you still need to scan the board, right? That's still O(n^2) IMHO.
1
Sigiloso
20 de abr. de 2012
I think it's actually O(3*9) time plus O(9) space, count sorting each row, column and 3x3 square. If even one of the integer in each row, column or square is counted twice you can just return false. If the counts succeed in all three cases then return true.
Sigiloso
20 de abr. de 2012
By the way, if the sudoku is not 3 * 3 based, but k * k, then you have O(3 * k * k) time (count sorting each row, column and square) and O(k * k) space.
Sigiloso
25 de abr. de 2012
def validate(grid):
results = [0] * 27
for i, v in enumerate(grid):
for j, w in enumerate(v):
box = j/3 + (i/3)*3
results[i] |= 1 << w-1
results[9+j] |= 1 << w-1
results[18+box] |= 1 << w-1
return len([1 for i in results if i == 511]) == 27 # 511 == 111111111
Sigiloso
4 de fev. de 2012
@Interview Candidate , I don't think your solution is correct, because there is a nother requirment which is that every 3X3 part is also 1-9, so the complexity becomes n^3.
@Gabriel, I don't understand your solution, can you make it clearer?
Sigiloso
7 de dez. de 2011
I use two loop to do the judgement and the time complexity is O(n^2)
Sigiloso
19 de dez. de 2011
It can be done in O(n) really easy :).
you need 27 variables (int). And based on the coordinates in the sudoku table you update for each value 3 of these by setting the corresponding bit to 1.
At the end in order to check the validity of the solution, it just needs all those 27 variables to be 111111111(2). If not, then you have no solution!
Implementing is straightforward!