Skip to content

Commit 75e31a1

Browse files
authored
Merge branch 'master' into array_combination_improve
2 parents 6c57be2 + adf21ab commit 75e31a1

File tree

5 files changed

+192
-0
lines changed

5 files changed

+192
-0
lines changed

DIRECTORY.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,13 +607,15 @@
607607
* [WiggleSort](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/sorts/WiggleSort.java)
608608
* stacks
609609
* [BalancedBrackets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/BalancedBrackets.java)
610+
* [CelebrityFinder](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/CelebrityFinder.java)
610611
* [DecimalToAnyUsingStack](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/DecimalToAnyUsingStack.java)
611612
* [DuplicateBrackets](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/DuplicateBrackets.java)
612613
* [InfixToPostfix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/InfixToPostfix.java)
613614
* [InfixToPrefix](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/InfixToPrefix.java)
614615
* [LargestRectangle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/LargestRectangle.java)
615616
* [MaximumMinimumWindow](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MaximumMinimumWindow.java)
616617
* [MinStackUsingSingleStack](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MinStackUsingSingleStack.java)
618+
* [MinStackUsingTwoStacks](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/MinStackUsingTwoStacks.java)
617619
* [NextGreaterElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextGreaterElement.java)
618620
* [NextSmallerElement](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/NextSmallerElement.java)
619621
* [PostfixEvaluator](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/stacks/PostfixEvaluator.java)
@@ -1162,12 +1164,14 @@
11621164
* [WiggleSortTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/sorts/WiggleSortTest.java)
11631165
* stacks
11641166
* [BalancedBracketsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/BalancedBracketsTest.java)
1167+
* [CelebrityFinderTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/CelebrityFinderTest.java)
11651168
* [DecimalToAnyUsingStackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/DecimalToAnyUsingStackTest.java)
11661169
* [DuplicateBracketsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/DuplicateBracketsTest.java)
11671170
* [InfixToPostfixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPostfixTest.java)
11681171
* [InfixToPrefixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/InfixToPrefixTest.java)
11691172
* [LargestRectangleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/LargestRectangleTest.java)
11701173
* [MinStackUsingSingleStackTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/MinStackUsingSingleStackTest.java)
1174+
* [MinStackUsingTwoStacksTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/MinStackUsingTwoStacksTest.java)
11711175
* [NextGreaterElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextGreaterElementTest.java)
11721176
* [NextSmallerElementTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/NextSmallerElementTest.java)
11731177
* [PostfixEvaluatorTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/stacks/PostfixEvaluatorTest.java)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.thealgorithms.stacks;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
* Solves the celebrity problem using a stack-based algorithm.
7+
*
8+
* <p>Celebrity is someone known by everyone but doesn't know anyone else.
9+
* <p>Applications: Graph theory and social network analysis.
10+
*
11+
* @author Hardvan
12+
*/
13+
public final class CelebrityFinder {
14+
private CelebrityFinder() {
15+
}
16+
17+
/**
18+
* Finds the celebrity in the given party matrix using a stack-based algorithm.
19+
*
20+
* @param party A 2D matrix where party[i][j] is 1 if i knows j, otherwise 0.
21+
* @return The index of the celebrity, or -1 if there is no celebrity.
22+
*/
23+
public static int findCelebrity(int[][] party) {
24+
25+
// Push all people onto the stack
26+
Stack<Integer> stack = new Stack<>();
27+
for (int i = 0; i < party.length; i++) {
28+
stack.push(i);
29+
}
30+
31+
// Find the potential celebrity by comparing pairs
32+
while (stack.size() > 1) {
33+
int person1 = stack.pop();
34+
int person2 = stack.pop();
35+
36+
if (party[person1][person2] == 1) {
37+
stack.push(person2); // person1 knows person2, so person2 might be the celebrity
38+
} else {
39+
stack.push(person1); // person1 doesn't know person2, so person1 might be the celebrity
40+
}
41+
}
42+
43+
// Verify the candidate
44+
int candidate = stack.pop();
45+
for (int i = 0; i < party.length; i++) {
46+
if (i != candidate && (party[candidate][i] == 1 || party[i][candidate] == 0)) {
47+
return -1;
48+
}
49+
}
50+
return candidate;
51+
}
52+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.thealgorithms.stacks;
2+
3+
import java.util.Stack;
4+
5+
/**
6+
* Min-Stack implementation that supports push, pop, and retrieving the minimum element in constant time.
7+
*
8+
* @author Hardvan
9+
*/
10+
public final class MinStackUsingTwoStacks {
11+
MinStackUsingTwoStacks() {
12+
}
13+
14+
private final Stack<Integer> stack = new Stack<>();
15+
private final Stack<Integer> minStack = new Stack<>();
16+
17+
/**
18+
* Pushes a new element onto the {@code stack}.
19+
* If the value is less than or equal to the current minimum, it is also pushed onto the {@code minStack}.
20+
*
21+
* @param value The value to be pushed.
22+
*/
23+
public void push(int value) {
24+
stack.push(value);
25+
if (minStack.isEmpty() || value <= minStack.peek()) {
26+
minStack.push(value);
27+
}
28+
}
29+
30+
/**
31+
* Removes the top element from the stack.
32+
* If the element is the minimum element, it is also removed from the {@code minStack}.
33+
*/
34+
public void pop() {
35+
if (stack.pop().equals(minStack.peek())) {
36+
minStack.pop();
37+
}
38+
}
39+
40+
/**
41+
* Retrieves the top element of the stack.
42+
*
43+
* @return The top element.
44+
*/
45+
public int top() {
46+
return stack.peek();
47+
}
48+
49+
/**
50+
* Retrieves the minimum element in the stack.
51+
*
52+
* @return The minimum element.
53+
*/
54+
public int getMin() {
55+
return minStack.peek();
56+
}
57+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.thealgorithms.stacks;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.stream.Stream;
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.Arguments;
8+
import org.junit.jupiter.params.provider.MethodSource;
9+
10+
public class CelebrityFinderTest {
11+
12+
@ParameterizedTest
13+
@MethodSource("providePartyMatrices")
14+
public void testCelebrityFinder(int[][] party, int expected) {
15+
assertEquals(expected, CelebrityFinder.findCelebrity(party));
16+
}
17+
18+
private static Stream<Arguments> providePartyMatrices() {
19+
return Stream.of(
20+
// Test case 1: Celebrity exists
21+
Arguments.of(new int[][] {{0, 1, 1}, {0, 0, 1}, {0, 0, 0}}, 2),
22+
23+
// Test case 2: No celebrity
24+
Arguments.of(new int[][] {{0, 1, 0}, {1, 0, 1}, {1, 1, 0}}, -1),
25+
26+
// Test case 3: Everyone knows each other, no celebrity
27+
Arguments.of(new int[][] {{0, 1, 1}, {1, 0, 1}, {1, 1, 0}}, -1),
28+
29+
// Test case 4: Single person, they are trivially a celebrity
30+
Arguments.of(new int[][] {{0}}, 0),
31+
32+
// Test case 5: All know the last person, and they know no one
33+
Arguments.of(new int[][] {{0, 1, 1, 1}, {0, 0, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}}, 3),
34+
35+
// Test case 6: Larger party with no celebrity
36+
Arguments.of(new int[][] {{0, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 0, 1}, {1, 1, 1, 0}}, -1),
37+
38+
// Test case 7: Celebrity at the start of the matrix
39+
Arguments.of(new int[][] {{0, 0, 0}, {1, 0, 1}, {1, 1, 0}}, 0));
40+
}
41+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.thealgorithms.stacks;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
public class MinStackUsingTwoStacksTest {
8+
9+
@Test
10+
public void testMinStackOperations() {
11+
MinStackUsingTwoStacks minStack = new MinStackUsingTwoStacks();
12+
minStack.push(3);
13+
minStack.push(5);
14+
assertEquals(3, minStack.getMin());
15+
16+
minStack.push(2);
17+
minStack.push(1);
18+
assertEquals(1, minStack.getMin());
19+
20+
minStack.pop();
21+
assertEquals(2, minStack.getMin());
22+
}
23+
24+
@Test
25+
public void testMinStackOperations2() {
26+
MinStackUsingTwoStacks minStack = new MinStackUsingTwoStacks();
27+
minStack.push(3);
28+
minStack.push(5);
29+
assertEquals(3, minStack.getMin());
30+
31+
minStack.push(2);
32+
minStack.push(1);
33+
assertEquals(1, minStack.getMin());
34+
35+
minStack.pop();
36+
assertEquals(2, minStack.getMin());
37+
}
38+
}

0 commit comments

Comments
 (0)