Skip to content

Commit cb364a5

Browse files
solves #51: N-Queens in java
1 parent b7c02bd commit cb364a5

File tree

4 files changed

+115
-65
lines changed

4 files changed

+115
-65
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
| 48 | [Rotate Image](https://leetcode.com/problems/rotate-image) | [![Java](assets/java.png)](src/RotateImage.java) | |
5858
| 49 | [Group Anagrams](https://leetcode.com/problems/group-anagrams) | [![Java](assets/java.png)](src/GroupAnagrams.java) | |
5959
| 50 | [Pow(x,n)](https://leetcode.com/problems/powx-n) | [![Java](assets/java.png)](src/Powxn.java) | |
60+
| 51 | [N-Queens](https://leetcode.com/problems/n-queens) | [![Java](assets/java.png)](src/NQueens.java) | |
6061
| 53 | [Maximum SubArray](https://leetcode.com/problems/maximum-subarray) | [![Java](assets/java.png)](src/MaximumSubArray.java) [![Python](assets/python.png)](python/maximum_sum_subarray.py) | |
6162
| 54 | [Spiral Matrix](https://leetcode.com/problems/spiral-matrix) | [![Java](assets/java.png)](src/SpiralMatrix.java) | |
6263
| 55 | [Jump Game](https://leetcode.com/problems/jump-game) | [![Java](assets/java.png)](src/JumpGame.java) | |

Diff for: src/CombinationSum.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// https://leetcode.com/problems/combination-sum
2-
// T: O(|candidates| ^ target)
3-
// S: O(target + candidate ^ 2) // not sure tho --> if anyone has any idea please feel free to contact me
2+
// M = smallest candidate
3+
// T: O(|candidates| ^ (target / M))
4+
// S: O(target / M) // not sure tho --> if anyone has any idea please feel free to contact me
45

56
import java.util.ArrayList;
67
import java.util.List;

Diff for: src/HelloWorld.java

+15-63
Original file line numberDiff line numberDiff line change
@@ -8,73 +8,25 @@
88
import java.util.Set;
99

1010
public class HelloWorld {
11-
// T: O(V + E) S: O(V + E)
12-
public int[] findOrder(int numCourses, int[][] prerequisites) {
13-
final Map<Integer, Set<Integer>> graph = createGraph(prerequisites);
14-
final int[] inDegree = computeInDegree(numCourses, prerequisites);
15-
return orderOfCourses(graph, inDegree);
11+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
12+
final Set<List<Integer>> result = new HashSet<>();
13+
computeSums(candidates, target, result, 0, new ArrayList<>(), 0);
14+
return new ArrayList<>(result);
1615
}
1716

18-
// T: O(V + E) S: O(V)
19-
private static int[] orderOfCourses(Map<Integer, Set<Integer>> graph, int[] inDegree) {
20-
final Queue<Integer> queue = new PriorityQueue<>();
21-
final List<Integer> order = new ArrayList<>();
22-
addAll0InDegreeToQueue(queue, inDegree);
23-
24-
while (!queue.isEmpty()) {
25-
final int vertex = queue.poll();
26-
order.add(vertex);
27-
for (int neighbour : graph.getOrDefault(vertex, new HashSet<>())) {
28-
inDegree[neighbour]--;
29-
if (inDegree[neighbour] == 0) {
30-
queue.add(neighbour);
31-
}
32-
}
33-
graph.remove(vertex);
17+
private static void computeSums(int[] candidates, int target, Set<List<Integer>> result, int currentSum, List<Integer> current, int i) {
18+
if (currentSum > target || i >= candidates.length) {
19+
return;
3420
}
35-
36-
if (order.size() != inDegree.length) {
37-
return new int[] {};
21+
if (currentSum == target) {
22+
result.add(new ArrayList<>(current));
23+
return;
3824
}
39-
return toArray(order);
40-
}
4125

42-
private static int[] toArray(List<Integer> list) {
43-
final int[] array = new int[list.size()];
44-
for (int i = 0 ; i < array.length ; i++) {
45-
array[i] = list.get(i);
46-
}
47-
return array;
48-
}
49-
50-
// T: O(E) S: O(1)
51-
private static void addAll0InDegreeToQueue(Queue<Integer> queue, int[] inDegree) {
52-
for (int i = 0 ; i < inDegree.length ; i++) {
53-
if (inDegree[i] == 0) {
54-
queue.add(i);
55-
}
56-
}
57-
}
58-
59-
// T: O(E) S: O(E)
60-
private static int[] computeInDegree(int n, int[][] edges) {
61-
final int[] inDegree = new int[n];
62-
for (int[] edge : edges) {
63-
final int to = edge[0];
64-
inDegree[to]++;
65-
}
66-
return inDegree;
67-
}
68-
69-
// T: O(|E|), S: O(E)
70-
private static Map<Integer, Set<Integer>> createGraph(int[][] edges) {
71-
final Map<Integer, Set<Integer>> graph = new HashMap<>();
72-
for (int[] edge : edges) {
73-
final int to = edge[0], from = edge[1];
74-
final Set<Integer> set = graph.getOrDefault(from, new HashSet<>());
75-
set.add(to);
76-
graph.putIfAbsent(from, set);
77-
}
78-
return graph;
26+
computeSums(candidates, target, result, currentSum, current, i + 1);
27+
current.add(candidates[i]);
28+
computeSums(candidates, target, result, currentSum + candidates[i], current, i);
29+
computeSums(candidates, target, result, currentSum + candidates[i], current, i + 1);
30+
current.removeLast();
7931
}
8032
}

Diff for: src/NQueens.java

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// https://leetcode.com/problems/n-queens
2+
// T: O(N!)
3+
// S: O(N^2)
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class NQueens {
9+
private static boolean[] rows, columns;
10+
11+
public static List<List<String>> solveNQueens(int n) {
12+
final List<List<String>> result = new ArrayList<>();
13+
final List<String> board = getEmptyBoard(n);
14+
rows = new boolean[n];
15+
columns = new boolean[n];
16+
nQueens(0, n, result, board, 0);
17+
return result;
18+
}
19+
20+
private static void nQueens(int row, int n, List<List<String>> result, List<String> board, int queens) {
21+
if (row == n) {
22+
if (queens == n) {
23+
result.add(new ArrayList<>(board));
24+
}
25+
return;
26+
}
27+
28+
for (int column = 0 ; column < n ; column++) {
29+
if (canPlace(board, row, column)) {
30+
placeQueen(board, row, column);
31+
nQueens(row + 1, n, result, board, queens + 1);
32+
removeQueen(board, row, column);
33+
}
34+
}
35+
}
36+
37+
private static void placeQueen(List<String> board, int row, int column) {
38+
board.set(
39+
row,
40+
board.get(row).substring(0, column) + 'Q' + board.get(row).substring(column + 1)
41+
);
42+
rows[row] = true;
43+
columns[column] = true;
44+
}
45+
46+
private static void removeQueen(List<String> board, int row, int column) {
47+
board.set(
48+
row,
49+
board.get(row).substring(0, column) + '.' + board.get(row).substring(column + 1)
50+
);
51+
rows[row] = false;
52+
columns[column] = false;
53+
}
54+
55+
private static boolean canPlace(List<String> board, int row, int column) {
56+
return !rows[row] && !columns[column] && !queenInLeftDiagonal(board, row, column)
57+
&& !queenInRightDiagonal(board, row, column);
58+
}
59+
60+
private static boolean queenInLeftDiagonal(List<String> board, int row, int column) {
61+
for (int i = row - 1, j = column - 1 ; i >= 0 && j >= 0 ; i--, j--) {
62+
if (board.get(i).charAt(j) == 'Q') {
63+
return true;
64+
}
65+
}
66+
for (int i = row + 1, j = column + 1 ; i < board.size() && j < board.size() ; i++, j++) {
67+
if (board.get(i).charAt(j) == 'Q') {
68+
return true;
69+
}
70+
}
71+
return false;
72+
}
73+
74+
private static boolean queenInRightDiagonal(List<String> board, int row, int column) {
75+
for (int i = row - 1, j = column + 1 ; i >= 0 && j < board.size() ; i--, j++) {
76+
if (board.get(i).charAt(j) == 'Q') {
77+
return true;
78+
}
79+
}
80+
for (int i = row + 1, j = column - 1 ; i < board.size() && j >= 0 ; i++, j--) {
81+
if (board.get(i).charAt(j) == 'Q') {
82+
return true;
83+
}
84+
}
85+
return false;
86+
}
87+
88+
private static List<String> getEmptyBoard(int n) {
89+
final List<String> board = new ArrayList<>();
90+
final String line = ".".repeat(n);
91+
for (int i = 0 ; i < n ; i++) {
92+
board.add(line);
93+
}
94+
return board;
95+
}
96+
}

0 commit comments

Comments
 (0)