Skip to content

Commit 09a8518

Browse files
authored
Merge pull request #3 from Subham1999/formatting_23aug2024
Formatting 23aug2024
2 parents 1264ab6 + 1adbbfb commit 09a8518

File tree

13 files changed

+1126
-77
lines changed

13 files changed

+1126
-77
lines changed

.idea/fileTemplates/internal/Class.java

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/workspace.xml

Lines changed: 88 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,16 @@
2828
<version>3.1.8</version>
2929
</dependency>
3030
</dependencies>
31+
<build>
32+
<plugins>
33+
<plugin>
34+
<groupId>org.apache.maven.plugins</groupId>
35+
<artifactId>maven-compiler-plugin</artifactId>
36+
<configuration>
37+
<source>21</source>
38+
<target>21</target>
39+
</configuration>
40+
</plugin>
41+
</plugins>
42+
</build>
3143
</project>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.subham.ta.backtracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class CombinationSumI {
7+
public List<List<Integer>> combinationSum(int[] candidates, int target) {
8+
List<List<Integer>> result = new ArrayList<>();
9+
List<Integer> runningSet = new ArrayList<>();
10+
combinationSum(candidates, candidates.length - 1, target, result, runningSet);
11+
return result;
12+
}
13+
14+
void combinationSum(
15+
int[] arr, int index, int target, List<List<Integer>> result, List<Integer> currentSet) {
16+
if (index < 0 || target < 0) {
17+
return;
18+
}
19+
20+
if (target == 0) {
21+
result.add(new ArrayList<>(currentSet));
22+
return;
23+
}
24+
25+
// include
26+
currentSet.addLast(arr[index]);
27+
combinationSum(arr, index, target - arr[index], result, currentSet);
28+
currentSet.removeLast();
29+
30+
// exclude
31+
combinationSum(arr, index - 1, target, result, currentSet);
32+
}
33+
34+
public static void main(String[] args) {
35+
System.out.println(new CombinationSumI().combinationSum(new int[] {2, 3, 6, 7}, 7));
36+
}
37+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.subham.ta.backtracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
import java.util.stream.Collectors;
7+
8+
/**
9+
* @author: Subham Santra
10+
*/
11+
public class PermutationI {
12+
13+
public List<List<Integer>> permute(int[] nums) {
14+
List<List<Integer>> result = new ArrayList<>();
15+
permute(nums, 0, result);
16+
return result;
17+
}
18+
19+
void permute(int[] arr, int i, List<List<Integer>> result) {
20+
if (i == arr.length) {
21+
result.add(Arrays.stream(arr).boxed().collect(Collectors.toList()));
22+
return;
23+
}
24+
25+
for (int j = i; j < arr.length; ++j) {
26+
swap(arr, i, j);
27+
permute(arr, i + 1, result);
28+
swap(arr, i, j);
29+
}
30+
}
31+
32+
void swap(int[] arr, int f, int t) {
33+
int x = arr[f];
34+
arr[f] = arr[t];
35+
arr[t] = x;
36+
}
37+
38+
public static void main(String[] args) {
39+
System.out.println(new PermutationI().permute(new int[] {0}));
40+
System.out.println(new PermutationI().permute(new int[] {1}));
41+
System.out.println(new PermutationI().permute(new int[] {1, 2}));
42+
System.out.println(new PermutationI().permute(new int[] {1, 2, 3}));
43+
}
44+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.subham.ta.backtracking;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class Subsets {
7+
static class Solution {
8+
public List<List<Integer>> subsets(int[] nums) {
9+
int len = nums.length;
10+
int powerLen = 1 << len;
11+
12+
List<List<Integer>> result = new ArrayList<>();
13+
for (int i = 0; i < powerLen; ++i) {
14+
int j = i;
15+
int k = 0;
16+
List<Integer> set = new ArrayList<>();
17+
while (j > 0) {
18+
if ((j & 1) == 1) {
19+
set.add(nums[k]);
20+
}
21+
++k;
22+
j >>= 1;
23+
}
24+
result.add(set);
25+
}
26+
return result;
27+
}
28+
}
29+
30+
public static void main(String[] args) {
31+
System.out.println(new Solution().subsets(new int[] {1, 2}));
32+
}
33+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.subham.ta.graph;
2+
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
6+
import java.util.Set;
7+
import java.util.concurrent.atomic.AtomicInteger;
8+
9+
public final class ArticulationPointOnDirectedGraph {
10+
public static <K, V> Set<Vertex<K, V>> findArticulationPoint(final Graph<K, V> graph) {
11+
final Map<Vertex<K, V>, Integer> highTime = new HashMap<>();
12+
final Map<Vertex<K, V>, Integer> lowTime = new HashMap<>();
13+
final Set<Vertex<K, V>> articulationPoints = new HashSet<>();
14+
final Set<Vertex<K, V>> visitedSet = new HashSet<>();
15+
final AtomicInteger timer = new AtomicInteger(0);
16+
17+
Vertex<K, V> root = graph.getVertexSet().iterator().next();
18+
DFS(timer, graph, root, null, highTime, lowTime, articulationPoints, visitedSet);
19+
20+
return articulationPoints;
21+
}
22+
23+
private static <K, V> void DFS(
24+
final AtomicInteger timer,
25+
final Graph<K, V> graph,
26+
final Vertex<K, V> currentVertex,
27+
final Vertex<K, V> parent,
28+
final Map<Vertex<K, V>, Integer> highTime,
29+
final Map<Vertex<K, V>, Integer> lowTime,
30+
final Set<Vertex<K, V>> articulationPoints,
31+
final Set<Vertex<K, V>> visitedSet) {
32+
33+
if (visitedSet.contains(currentVertex)) {
34+
return;
35+
}
36+
37+
visitedSet.add(currentVertex);
38+
int currentTime = timer.incrementAndGet();
39+
40+
highTime.put(currentVertex, currentTime);
41+
lowTime.put(currentVertex, currentTime);
42+
43+
for (final Vertex<K, V> children : currentVertex.getNeighbors()) {
44+
if (children.equals(parent)) {
45+
continue;
46+
}
47+
DFS(timer, graph, children, currentVertex, highTime, lowTime, articulationPoints, visitedSet);
48+
}
49+
50+
// calculate low time for current vertex.
51+
for (final Vertex<K, V> children : currentVertex.getNeighbors()) {
52+
if (children.equals(parent)) {
53+
continue;
54+
}
55+
lowTime.put(
56+
currentVertex,
57+
Math.min(lowTime.getOrDefault(children, Integer.MAX_VALUE), lowTime.get(currentVertex)));
58+
}
59+
}
60+
61+
public static void main(String[] args) {
62+
Graph<Character, Character> graph = new Graph<>(false);
63+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('A', 'B'));
64+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('A', 'C'));
65+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('C', 'B'));
66+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('C', 'D'));
67+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('E', 'D'));
68+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('E', 'G'));
69+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('E', 'F'));
70+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('G', 'F'));
71+
graph.addEdge(Edge.createSimpleEdgeUnWeighted('H', 'F'));
72+
73+
System.out.println(findArticulationPoint(graph));
74+
}
75+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.subham.ta.graph;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
public class CoursesII {
10+
static class Solution {
11+
private boolean cycleExists = false;
12+
private List<Integer> orderedList;
13+
14+
public int[] findOrder(int numCourses, int[][] prerequisites) {
15+
orderedList = new ArrayList<>();
16+
Map<Integer, List<Integer>> graph = new HashMap<>();
17+
for (int i = 0; i < numCourses; ++i) {
18+
graph.putIfAbsent(i, new ArrayList<>());
19+
}
20+
21+
for (int[] edge : prerequisites) {
22+
graph.get(edge[1]).add(edge[0]);
23+
}
24+
25+
// System.out.println(graph);
26+
int[] visited = new int[numCourses];
27+
28+
for (Map.Entry<Integer, List<Integer>> e : graph.entrySet()) {
29+
if (visited[e.getKey()] == 0) {
30+
dfs(graph, numCourses, e.getKey(), visited);
31+
}
32+
}
33+
34+
int[] res = new int[orderedList.size()];
35+
36+
System.out.println(orderedList);
37+
38+
for (int i = orderedList.size() - 1, j = 0; (i >= 0); --i, ++j) {
39+
res[j] = orderedList.get(i);
40+
}
41+
42+
return cycleExists ? new int[] {} : res;
43+
}
44+
45+
void dfs(Map<Integer, List<Integer>> graph, int courseLen, int node, int[] visited) {
46+
if (cycleExists) {
47+
return;
48+
}
49+
50+
if (!(0 <= node && node < courseLen) || visited[node] == 2) {
51+
return;
52+
}
53+
54+
if (visited[node] == 1) {
55+
cycleExists = true;
56+
return;
57+
}
58+
59+
visited[node] = 1;
60+
61+
for (int next : graph.get(node)) {
62+
dfs(graph, courseLen, next, visited);
63+
}
64+
65+
visited[node] = 2;
66+
orderedList.add(node);
67+
}
68+
}
69+
70+
public static void main(String[] args) {
71+
System.out.println(
72+
Arrays.toString(new Solution().findOrder(4, new int[][] {{1, 0}, {2, 0}, {3, 1}, {3, 2}})));
73+
}
74+
}
Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
package com.subham.ta.graph;
22

33
import java.util.Objects;
4+
import lombok.AccessLevel;
45
import lombok.AllArgsConstructor;
56
import lombok.Getter;
67

7-
@AllArgsConstructor
8+
@AllArgsConstructor(access = AccessLevel.PRIVATE)
89
@Getter
910
public class Edge<K, V> {
10-
private Vertex<K, V> start;
11-
private Vertex<K, V> end;
11+
private Vertex<K, V> vertex1;
12+
private Vertex<K, V> vertex2;
1213
private double weight = 1D;
1314

15+
public static <V> Edge<V, V> createSimpleEdgeUnWeighted(V v1, V v2) {
16+
return new Edge<>(Vertex.create(v1), Vertex.create(v2), 0D);
17+
}
18+
1419
@Override
1520
public boolean equals(Object o) {
1621
if (this == o) return true;
1722
if (!(o instanceof Edge<?, ?> edge)) return false;
1823
return Double.compare(getWeight(), edge.getWeight()) == 0
19-
&& Objects.equals(getStart(), edge.getStart())
20-
&& Objects.equals(getEnd(), edge.getEnd());
24+
&& Objects.equals(getVertex1(), edge.getVertex1())
25+
&& Objects.equals(getVertex2(), edge.getVertex2());
2126
}
2227

2328
@Override
2429
public int hashCode() {
25-
return Objects.hash(getStart(), getEnd(), getWeight());
30+
return Objects.hash(getVertex1(), getVertex2(), getWeight());
2631
}
2732
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.subham.ta.graph;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
@AllArgsConstructor
9+
@Getter
10+
public class Graph<K, V> {
11+
private Set<Vertex<K, V>> vertexSet;
12+
private Set<Edge<K, V>> edgeSet;
13+
private boolean isDirected;
14+
15+
public Graph(boolean isDirected) {
16+
this.isDirected = isDirected;
17+
this.vertexSet = new HashSet<>();
18+
this.edgeSet = new HashSet<>();
19+
}
20+
21+
public void addEdge(Edge<K, V> edge) {
22+
if (!edgeSet.contains(edge)) {
23+
vertexSet.add(edge.getVertex1());
24+
vertexSet.add(edge.getVertex2());
25+
edgeSet.add(edge);
26+
27+
edge.getVertex1().getEdges().add(edge);
28+
edge.getVertex1().getNeighbors().add(edge.getVertex2());
29+
if (!this.isDirected()) {
30+
edge.getVertex2().getEdges().add(edge);
31+
edge.getVertex2().getNeighbors().add(edge.getVertex1());
32+
}
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)