Skip to content

Commit 9431af9

Browse files
committed
Add more solutions
1 parent 84de6b5 commit 9431af9

12 files changed

+514
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.sean.array;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
/***
8+
* 1743. Restore the Array From Adjacent Pairs
9+
*/
10+
public class AdjacentPairsToArray {
11+
public int[] restoreArray(int[][] adjacentPairs) {
12+
int length = adjacentPairs.length;
13+
if(length == 1) {
14+
return adjacentPairs[0];
15+
}
16+
17+
Map<Integer, ArrayList<Integer>> map = new HashMap<>();
18+
for (int[] pair : adjacentPairs) {
19+
int p = pair[0];
20+
int v = pair[1];
21+
22+
fillMap(map, p, v);
23+
fillMap(map, v, p);
24+
}
25+
26+
// N-1 relations keep the duplicate references of middle nodes, excluding the header and the tail nodes
27+
// e.g.
28+
// Input: adjacentPairs = [[4,-2],[1,4],[-3,1]]
29+
// Output: [-2,4,1,-3]
30+
// ====================
31+
// Constructed map :
32+
// <4, [-2, 1]>
33+
// <1, [4, -3]>
34+
// <-2, [4]>
35+
// <-3, [1]>
36+
37+
int startNum = 0;
38+
for (Integer k : map.keySet()) {
39+
ArrayList<Integer> array = map.get(k);
40+
if(array.size() == 1) {
41+
startNum = k;
42+
break;
43+
}
44+
}
45+
ArrayList<Integer> out = new ArrayList<>();
46+
out.add(startNum);
47+
48+
int lastKey = startNum;
49+
int prev = map.get(startNum).get(0);
50+
out.add(prev);
51+
52+
int outLen = length + 1;
53+
while (out.size() < outLen) {
54+
ArrayList<Integer> list = map.get(prev);
55+
if(list.size() > 1) {
56+
if(list.get(0) != lastKey) {
57+
out.add(list.get(0));
58+
} else {
59+
out.add(list.get(1));
60+
}
61+
lastKey = prev;
62+
prev = out.get(out.size() - 1);
63+
} else {
64+
out.add(list.get(0));
65+
break;
66+
}
67+
}
68+
69+
return out.stream().mapToInt(value -> value).toArray();
70+
}
71+
72+
private void fillMap(Map<Integer, ArrayList<Integer>> map, int p, int v) {
73+
if(map.containsKey(p)) {
74+
map.get(p).add(v);
75+
} else {
76+
ArrayList<Integer> arr = new ArrayList<>();
77+
arr.add(v);
78+
map.put(p, arr);
79+
}
80+
}
81+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.sean.array;
2+
3+
import java.util.Arrays;
4+
5+
/***
6+
* 1833. Maximum Ice Cream Bars
7+
*/
8+
public class IceCreamCounter {
9+
public int maxIceCream(int[] costs, int coins) {
10+
Arrays.sort(costs);
11+
12+
int max = 0;
13+
for (int i = 0; i < costs.length; i++) {
14+
if (coins >= costs[i]) {
15+
max++;
16+
coins -= costs[i];
17+
}else {
18+
break;
19+
}
20+
}
21+
return max;
22+
}
23+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.sean.array;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
/***
8+
* 93. Restore IP Addresses
9+
*/
10+
public class IpChecker {
11+
public List<String> restoreIpAddresses(String s) {
12+
int length = s.length();
13+
if (length < 4 || length > 12)
14+
return Collections.emptyList();
15+
16+
List<String> out = new ArrayList<>();
17+
int i1, i2, i3, i4;
18+
for (int i = 1; i <= 3; i++) {
19+
String fir = s.substring(0, i);
20+
if (fir.length() > 1 && fir.charAt(0) == '0')
21+
break;
22+
i1 = Integer.parseInt(fir);
23+
if (i1 >= 256)
24+
break;
25+
26+
for (int j = i + 1; j <= i + 3 && j <= length - 2; j++) { // 2 digits left for last 2 parts
27+
String sec = s.substring(i, j);
28+
if (sec.length() > 1 && sec.charAt(0) == '0')
29+
break;
30+
i2 = Integer.parseInt(sec);
31+
if (i2 >= 256)
32+
break;
33+
34+
for (int k = j + 1; k <= j + 3 && k <= length - 1; k++) {
35+
String thr = s.substring(j, k);
36+
if (thr.length() > 1 && thr.charAt(0) == '0')
37+
break;
38+
39+
i3 = Integer.parseInt(thr);
40+
if (i3 >= 256)
41+
break;
42+
43+
String four = s.substring(k);
44+
if(four.length() < 1 || four.length() > 3)
45+
continue;
46+
if (four.length() > 1 && four.charAt(0) == '0')
47+
continue;
48+
49+
i4 = Integer.parseInt(four);
50+
if (i4 >= 256)
51+
continue;
52+
53+
String n = i1 + "." + i2 + "." + i3 + "." + i4;
54+
out.add(n);
55+
}
56+
}
57+
}
58+
59+
return out;
60+
}
61+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.sean.array;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
/***
9+
* 1079. Letter Tile Possibilities
10+
*/
11+
public class LetterTile {
12+
List<String> generate(List<String> words, String ch) {
13+
Set<String> set = new HashSet<>(words);
14+
set.add(ch);
15+
16+
for (String word : words) {
17+
set.add(word + ch);
18+
set.add(ch + word);
19+
for (int j = 1; j < word.length(); j++) {
20+
set.add(word.substring(0, j) + ch + word.substring(j));
21+
}
22+
}
23+
return new ArrayList<>(set);
24+
}
25+
26+
public int numTilePossibilities(String tiles) {
27+
List<String> outWords = new ArrayList<>();
28+
for (int i = 0; i < tiles.length(); i++) {
29+
String ch = tiles.charAt(i) + "";
30+
outWords = generate(outWords, ch);
31+
}
32+
return outWords.size();
33+
}
34+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package org.sean.array;
2+
3+
import java.util.LinkedList;
4+
5+
/***
6+
* 986. Interval List Intersections
7+
*/
8+
public class ListIntersection {
9+
int lastLocatedPos = 0;
10+
LinkedList<int[]> ret = new LinkedList<>();
11+
12+
public int[][] intervalIntersection(int[][] A, int[][] B) {
13+
if (A == null || A.length == 0 || B == null || B.length == 0)
14+
return new int[0][0];
15+
16+
int lenA = A.length;
17+
int lenB = B.length;
18+
19+
int i = 0;
20+
21+
int[] pair;
22+
while (i < lenB) {
23+
pair = B[i];
24+
int pos = findRangeInterval(pair, lastLocatedPos, A);
25+
if (pos >= 0) {
26+
boolean fullyMerged = mergeIntervals(B, i, A, pos);
27+
if (fullyMerged) {
28+
++i;
29+
} else {
30+
// still have partial segment
31+
continue;
32+
}
33+
} else { // not found
34+
++i;
35+
}
36+
}
37+
if (!ret.isEmpty()) {
38+
int[][] arraies = new int[ret.size()][2];
39+
int index = 0;
40+
for (int[] arr : ret) {
41+
arraies[index++] = arr;
42+
}
43+
44+
return arraies;
45+
}
46+
47+
return new int[0][0];
48+
}
49+
50+
int findRangeInterval(int[] elem, int fromPos, int[][] targets) {
51+
int length = targets.length;
52+
for (int i = fromPos; i < length; i++) {
53+
int[] ints = targets[i];
54+
if (elem[0] >= ints[0] && elem[0] <= ints[1]
55+
|| (elem[1] >= ints[0] && elem[1] <= ints[1])
56+
|| ints[0] >= elem[0] && ints[0] <= elem[1]
57+
|| ints[1] >= elem[0] && ints[1] <= elem[1]
58+
) {
59+
return i;
60+
}
61+
}
62+
return -1;
63+
}
64+
65+
66+
/***
67+
* @return true if merged completely; otherwise false.
68+
*/
69+
private boolean mergeIntervals(int[][] b, int i, int[][] a, int pos) {
70+
int[] arr1 = b[i];
71+
int[] arr2 = a[pos];
72+
int s1 = arr1[0], e1 = arr1[1];
73+
int s2 = arr2[0], e2 = arr2[1];
74+
int s, e;
75+
s = s1 <= s2 ? s2 : s1;
76+
e = e1 <= e2 ? e1 : e2;
77+
78+
ret.add(new int[]{s, e});
79+
//System.out.println(String.format(">>> %d:%d added ", s, e));
80+
81+
if (e2 == e && e1 == e2) {
82+
lastLocatedPos = pos + 1;
83+
} else if (e2 - e > 0) {
84+
arr2[0] = e + 1;
85+
a[pos] = arr2;
86+
87+
} else if (e1 - e > 0) {
88+
arr1[0] = e + 1;
89+
b[i] = arr1;
90+
91+
lastLocatedPos = pos + 1;
92+
93+
return false;
94+
}
95+
96+
return true;
97+
98+
}
99+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.sean.array;
2+
3+
import java.util.Map;
4+
import java.util.TreeMap;
5+
6+
/***
7+
* 2070. Most Beautiful Item for Each Query
8+
*/
9+
public class MaxBeautyCounter {
10+
public int[] maximumBeauty(int[][] items, int[] queries) {
11+
// get rid of the duplicate ones, keep the entry with large value
12+
TreeMap<Integer, Integer> map = new TreeMap<>(Integer::compare);
13+
for (int[] p : items) {
14+
if (map.containsKey(p[0])) {
15+
if (map.get(p[0]) < p[1]) {
16+
map.put(p[0], p[1]);
17+
}
18+
} else {
19+
map.put(p[0], p[1]);
20+
}
21+
}
22+
23+
int size = map.size();
24+
int[][] nItems = new int[size][2];
25+
26+
int index = 0;
27+
for (int i : map.keySet()) {
28+
nItems[index++] = new int[]{i, map.get(i)};
29+
}
30+
31+
int maxSoFar = 0;
32+
for (int[] pair : nItems) {
33+
if (maxSoFar < pair[1]) {
34+
maxSoFar = pair[1];
35+
} else {
36+
pair[1] = maxSoFar;
37+
map.put(pair[0], pair[1]);
38+
}
39+
}
40+
41+
int[] result = new int[queries.length];
42+
for (int i = 0; i < queries.length; i++) {
43+
int q = queries[i];
44+
if (q < nItems[0][0]) {
45+
result[i] = 0;
46+
} else {
47+
Map.Entry<Integer, Integer> entry = map.floorEntry(queries[i]);
48+
result[i] = entry.getValue();
49+
}
50+
}
51+
return result;
52+
}
53+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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 AdjacentPairsToArrayTest {
9+
10+
private AdjacentPairsToArray pairsToArray;
11+
12+
@Before
13+
public void setUp() throws Exception {
14+
pairsToArray = new AdjacentPairsToArray();
15+
}
16+
17+
@Test
18+
public void restoreArray() {
19+
assertArrayEquals(new int[]{1, 2, 3, 4}, pairsToArray.restoreArray(new int[][]{{2, 1}, {3, 4}, {3, 2}}));
20+
assertArrayEquals(new int[]{-2, 4, 1, -3}, pairsToArray.restoreArray(new int[][]{{4, -2}, {1, 4}, {-3, 1}}));
21+
assertArrayEquals(new int[]{100000, -100000}, pairsToArray.restoreArray(new int[][]{{100000, -100000}}));
22+
}
23+
}

0 commit comments

Comments
 (0)