Skip to content

Commit 27bce46

Browse files
committed
Solutions added for LeetCode problems #71, #417, #2007
1 parent f735255 commit 27bce46

File tree

6 files changed

+320
-0
lines changed

6 files changed

+320
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.sean.array;
2+
3+
import java.util.*;
4+
5+
/***
6+
* 2007. Find Original Array From Doubled Array
7+
*/
8+
public class ArrayFinder {
9+
// O(N)
10+
public int[] findOriginalArray(int[] changed) {
11+
int[] emptyArray = new int[0];
12+
int len = changed.length;
13+
if (len % 2 != 0) {
14+
return emptyArray;
15+
}
16+
17+
int max = Arrays.stream(changed).max().getAsInt();
18+
int[] freq = new int[max + 1];
19+
int[] out = new int[len / 2];
20+
21+
for (int e : changed) {
22+
freq[e] += 1;
23+
}
24+
25+
int j = 0;
26+
for (int i = 0; i <= max; i++) {
27+
while (freq[i] > 0) {
28+
if (2 * i <= max && freq[i + i] > 0) {
29+
freq[i] -= 1;
30+
freq[i + i] -= 1;
31+
32+
if (freq[i] < 0 || freq[i + i] < 0)
33+
return emptyArray;
34+
35+
out[j++] = i;
36+
} else {
37+
return emptyArray;
38+
}
39+
}
40+
}
41+
return out;
42+
}
43+
44+
// O(N*lgN)
45+
public int[] findOriginalArray0(int[] changed) {
46+
int[] emptyArray = new int[0];
47+
if (changed.length % 2 != 0) {
48+
return emptyArray;
49+
}
50+
51+
Arrays.sort(changed);
52+
53+
int len = changed.length;
54+
55+
// {k, [v]s}
56+
HashMap<Integer, List<Integer>> map = new HashMap<>();
57+
58+
for (int i = 0; i < len; i++) {
59+
List<Integer> positions = map.getOrDefault(changed[i], new ArrayList<>());
60+
positions.add(i);
61+
62+
map.put(changed[i], positions);
63+
}
64+
65+
List<Integer> out = new ArrayList<>();
66+
int mid = len / 2;
67+
68+
int cnt = 0;
69+
Set<Integer> visitedPos = new HashSet<>();
70+
71+
for (int i = len - 1; i >= 0; i--) {
72+
if (visitedPos.contains(i))
73+
continue;
74+
75+
int elem = changed[i];
76+
visitedPos.add(i);
77+
78+
List<Integer> list = map.get(elem);
79+
list.remove(list.size() - 1);
80+
if (list.size() == 0) {
81+
map.remove(elem);
82+
}
83+
84+
if (elem % 2 == 0 && map.get(elem / 2) != null) {
85+
int n = elem / 2;
86+
if (map.containsKey(n)) {
87+
List<Integer> posList = map.get(n);
88+
89+
visitedPos.add(posList.get(posList.size() - 1));
90+
posList.remove(posList.size() - 1);
91+
92+
if (posList.size() == 0)
93+
map.remove(n);
94+
95+
out.add(n);
96+
97+
if (out.size() >= mid) {
98+
break;
99+
}
100+
} else {
101+
//System.out.println("not found in map : " + n);
102+
return emptyArray;
103+
}
104+
} else {
105+
//System.out.println("not found in map : " + n);
106+
return emptyArray;
107+
}
108+
}
109+
110+
int[] array = out.stream().mapToInt(v -> v).toArray();
111+
return array.length == len / 2 ? array : emptyArray;
112+
}
113+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.sean.graph;
2+
3+
import java.util.*;
4+
5+
/***
6+
* 417. Pacific Atlantic Water Flow
7+
*/
8+
public class OceanWaterFlow {
9+
private int[][] moves = new int[][]{
10+
{1, 0}, {0, 1}, {-1, 0}, {0, -1}
11+
};
12+
private Set<Integer> visited = new HashSet<>();
13+
private int[][] matrix;
14+
15+
public List<List<Integer>> pacificAtlantic(int[][] heights) {
16+
int rowCnt = heights.length;
17+
int colCnt = heights[0].length;
18+
19+
Queue<Integer> queue = new LinkedList<>();
20+
matrix = new int[rowCnt][colCnt];
21+
22+
// pacific
23+
for (int i = 0; i < rowCnt; i++) {
24+
queue.add(i * colCnt);
25+
visited.add(i * colCnt);
26+
}
27+
for (int i = 0; i < colCnt; i++) {
28+
queue.add(i);
29+
visited.add(i);
30+
}
31+
traverse(heights, rowCnt, colCnt, queue, 1);
32+
33+
// atlantic
34+
visited.clear();
35+
queue.clear();
36+
for (int i = 0; i < rowCnt; i++) {
37+
queue.add(colCnt * (i + 1) - 1);
38+
}
39+
for (int j = 0; j < colCnt; j++) {
40+
queue.add((rowCnt - 1) * colCnt + j);
41+
}
42+
traverse(heights, rowCnt, colCnt, queue, 2);
43+
44+
ArrayList<List<Integer>> out = new ArrayList<>();
45+
for (int i = 0; i < rowCnt; i++) {
46+
for (int j = 0; j < colCnt; j++) {
47+
if (matrix[i][j] == 3) {
48+
out.add(Arrays.asList(i, j));
49+
}
50+
}
51+
}
52+
53+
return out;
54+
}
55+
56+
private void traverse(int[][] heights, int rowCnt, int colCnt, Queue<Integer> queue, int dlt) {
57+
while (!queue.isEmpty()) {
58+
int sz = queue.size();
59+
for (int i = 0; i < sz; i++) {
60+
int loc = queue.poll();
61+
int row = loc / colCnt;
62+
int col = loc % colCnt;
63+
64+
if (matrix[row][col] < dlt)
65+
matrix[row][col] += dlt;
66+
67+
for (int[] diff : moves) {
68+
int nR = row + diff[0];
69+
int nC = col + diff[1];
70+
int newLoc = nR * colCnt + nC;
71+
if (nR >= 0 && nR < rowCnt && nC >= 0 && nC < colCnt && heights[row][col] <= heights[nR][nC]
72+
&& !visited.contains(newLoc)) {
73+
queue.add(newLoc);
74+
visited.add(loc);
75+
}
76+
}
77+
}
78+
}
79+
}
80+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.sean.stack;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.Deque;
5+
6+
/***
7+
* 71. Simplify Path
8+
*/
9+
public class PathHelper {
10+
public String simplifyPath(String path) {
11+
if (path.equals("/"))
12+
return path;
13+
14+
String[] segments = path.split("\\/+");
15+
16+
Deque<String> stack = new ArrayDeque<>();
17+
for (String segment : segments) {
18+
if (segment.equals(".")) {
19+
// No-Op
20+
} else if (segment.equals("..")) {
21+
if (!stack.isEmpty()) {
22+
stack.pop();
23+
}
24+
} else {
25+
if (!segment.isEmpty())
26+
stack.push(segment);
27+
}
28+
}
29+
30+
StringBuilder builder = new StringBuilder();
31+
while (!stack.isEmpty()) {
32+
builder.insert(0, '/');
33+
builder.insert(1, stack.pop());
34+
}
35+
36+
if (builder.length() == 0) {
37+
builder.append('/');
38+
}
39+
40+
return builder.toString();
41+
}
42+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.sean.array;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
6+
import static org.junit.Assert.*;
7+
8+
public class ArrayFinderTest {
9+
10+
private ArrayFinder finder;
11+
12+
@Before
13+
public void setUp() throws Exception {
14+
finder = new ArrayFinder();
15+
16+
}
17+
18+
@Test
19+
public void findOriginalArray() {
20+
int[] array = finder.findOriginalArray(new int[]{1, 3, 4, 2, 6, 8});
21+
assertArrayEquals(new int[]{1, 3, 4}, array);
22+
}
23+
24+
@Test
25+
public void findInvalidArray() {
26+
assertArrayEquals(new int[0], finder.findOriginalArray(new int[]{6, 3, 0, 1}));
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.sean.graph;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
10+
import static org.junit.Assert.*;
11+
12+
public class OceanWaterFlowTest {
13+
14+
private OceanWaterFlow waterFlow;
15+
16+
@Before
17+
public void setUp() throws Exception {
18+
waterFlow = new OceanWaterFlow();
19+
}
20+
21+
@Test
22+
public void pacificAtlantic() {
23+
List<List<Integer>> lists = waterFlow.pacificAtlantic(new int[][]{
24+
{1, 2, 2, 3, 5}, {3, 2, 3, 4, 4}, {2, 4, 5, 3, 1}, {6, 7, 1, 4, 5}, {5, 1, 1, 2, 4}
25+
});
26+
27+
int[][] expected = new int[][]{{0, 4}, {1, 3}, {1, 4}, {2, 2}, {3, 0}, {3, 1}, {4, 0}};
28+
List<List<Integer>> expectedList = new ArrayList<>();
29+
for (int[] grp : expected) {
30+
expectedList.add(Arrays.asList(grp[0], grp[1]));
31+
}
32+
33+
assertEquals(expectedList, lists);
34+
}
35+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.sean.stack;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
6+
import static org.junit.Assert.*;
7+
8+
public class PathHelperTest {
9+
10+
private PathHelper helper;
11+
12+
@Before
13+
public void setUp() throws Exception {
14+
helper = new PathHelper();
15+
}
16+
17+
@Test
18+
public void simplifyPath() {
19+
assertEquals("/TJbrd/owxdG", helper.simplifyPath("///TJbrd/owxdG//"));
20+
assertEquals("/c", helper.simplifyPath("/a/./b/../../c/"));
21+
}
22+
}

0 commit comments

Comments
 (0)