Skip to content

Commit 35911d4

Browse files
committed
revisit some easy / mid questions
1 parent c6762b2 commit 35911d4

6 files changed

+243
-26
lines changed

src/problems/leetcode/ContainerWithMostWater.java

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,52 @@
11
package problems.leetcode;
22

3+
import java.util.Map;
4+
import java.util.TreeMap;
5+
36
/**
47
* https://leetcode.com/problems/container-with-most-water/
58
*/
69
public class ContainerWithMostWater {
710

11+
// runtime: O(N)
12+
// space: O(1)
813
public static int maxArea(int[] height) {
14+
if (height == null || height.length < 2) {
15+
return 0;
16+
}
17+
18+
int i = 0;
19+
int j = height.length - 1;
20+
int hl = height[i];
21+
int hr = height[j];
22+
int maxArea = Math.min(hl, hr) * (j - i);
23+
24+
while (i < j) {
25+
if (hl < hr) {
26+
while (i < j && hl >= height[i]) {
27+
i++;
28+
}
29+
if (i < j) {
30+
hl = height[i];
31+
}
32+
} else {
33+
while (i < j && hr >= height[j]) {
34+
j--;
35+
}
36+
if (i < j) {
37+
hr = height[j];
38+
}
39+
}
40+
41+
if (i < j) {
42+
maxArea = Math.max(maxArea, Math.min(hl, hr) * (j - i));
43+
}
44+
}
45+
46+
return maxArea;
47+
}
48+
49+
public static int maxArea3(int[] height) {
950
if (height == null || height.length == 0) {
1051
return 0;
1152
}
@@ -26,6 +67,7 @@ public static int maxArea(int[] height) {
2667
return maxArea;
2768
}
2869

70+
// brute force
2971
public static int maxArea2(int[] height) {
3072
int maxArea = 0, maxH = 0;
3173
for (int i = 0; i < height.length; i++) {
@@ -40,16 +82,17 @@ public static int maxArea2(int[] height) {
4082
maxArea = area;
4183
maxH = h;
4284
}
43-
//maxArea = Math.max(maxArea, w * h);
85+
// maxArea = Math.max(maxArea, w * h);
4486
}
4587
}
4688

4789
return maxArea;
4890
}
4991

5092
public static void main(String[] args) {
51-
int[] heights = {1, 8, 6, 2, 5, 4, 8, 3, 7};
52-
System.out.println(maxArea(heights));
93+
System.out.println(maxArea(new int[] { 1, 8, 6, 2, 5, 4, 8, 3, 7 }));
94+
System.out.println(maxArea(new int[] { 1, 0, 0, 0, 0, 0, 0, 2, 2 }));
95+
System.out.println(maxArea(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }));
5396
}
5497

5598
}

src/problems/leetcode/LongestPalindromicSubstring.java

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,56 @@
66
public class LongestPalindromicSubstring {
77

88
public static void main(String[] args) {
9-
String s = "babadada";
9+
// String s = "babadada";
1010
// String s = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
11-
String longestPal = new LongestPalindromicSubstring().longestPalindrome(s);
12-
System.out.println(longestPal);
11+
// String longestPal = new LongestPalindromicSubstring().longestPalindrome(s);
12+
// System.out.println(longestPal);
13+
14+
System.out.println(longestPalindrome("ccc"));
15+
}
16+
17+
// runtime: O(N^2)
18+
// space: O(N^2)
19+
public static String longestPalindrome(String s) {
20+
if (s == null || s.length() < 2) {
21+
return s;
22+
}
23+
24+
int[][] m = new int[s.length()][s.length()];
25+
// base
26+
// P(i, i) = true
27+
// P(i, i+1) = (Si == Si+1)
28+
String result = s.substring(0, 1);
29+
for (int i = 0; i < s.length(); i++) {
30+
m[i][i] = 1;
31+
if (i + 1 < s.length()) {
32+
if (s.charAt(i) == s.charAt(i + 1)) {
33+
m[i][i + 1] = 2;
34+
result = s.substring(i, i + 2);
35+
} else {
36+
m[i][i + 1] = 0;
37+
}
38+
}
39+
}
40+
41+
// common
42+
// P(i, j) = (P(i + 1, j - 1) + Si == Sj)
43+
for (int len = 3; len <= s.length(); len++) {
44+
for (int i = 0; i <= s.length() - len; i++) {
45+
int j = i + len - 1;
46+
int p = m[i + 1][j - 1];
47+
m[i][j] = (p != 0 && s.charAt(i) == s.charAt(j)) ? p + 2 : 0;
48+
// System.out.println("i=" + i + ", len=" + len + ", p=" + m[i][j]);
49+
if (m[i][j] > result.length()) {
50+
result = s.substring(i, i + len);
51+
}
52+
}
53+
}
54+
55+
return result;
1356
}
1457

15-
public String longestPalindrome(String s) {
58+
public String longestPalindromeDP(String s) {
1659
if (s == null || s.length() <= 1) {
1760
return s;
1861
}
@@ -54,4 +97,38 @@ public String longestPalindrome(String s) {
5497
return s.substring(start, start + maxLen);
5598
}
5699

100+
// runtime: O(N^3) if the longest palindrome has length of 1
101+
// space: O(1)
102+
public String longestPalindromeBruteForce(String s) {
103+
if (s == null || s.length() < 2) {
104+
return s;
105+
}
106+
107+
String result = null;
108+
for (int i = 0; i < s.length(); i++) {
109+
for (int j = s.length() - 1; j >= i; j--) {
110+
String sub = s.substring(i, j + 1);
111+
if (result != null && sub.length() <= result.length()) {
112+
continue;
113+
} else if (isPalindrome(sub)) {
114+
result = sub;
115+
}
116+
}
117+
}
118+
119+
return result;
120+
}
121+
122+
private boolean isPalindrome(String s) {
123+
int i = 0, j = s.length() - 1;
124+
while (i < j) {
125+
if (s.charAt(i++) != s.charAt(j--)) {
126+
return false;
127+
}
128+
}
129+
130+
return true;
131+
}
132+
133+
57134
}

src/problems/leetcode/LongestSubstringWithoutRepeatingCharacters.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
*/
1111
public class LongestSubstringWithoutRepeatingCharacters {
1212

13+
// runtime: O(N^3)
14+
// space: O(N)
1315
public static int lengthOfLongestSubstringBruteForce(String s) {
1416
int maxLength = 0;
1517

1618
for (int i = 0; i < s.length(); i++) {
1719
Set<Character> chars = new HashSet<>();
18-
int j = i;
19-
for (; j < s.length(); j++) {
20+
for (int j = i; j < s.length(); j++) {
2021
if (!chars.add(s.charAt(j))) {
2122
break;
2223
}
@@ -27,6 +28,8 @@ public static int lengthOfLongestSubstringBruteForce(String s) {
2728
return maxLength;
2829
}
2930

31+
// runtime: O(N)
32+
// space: O(N)
3033
public static int lengthOfLongestSubstring(String s) {
3134
int maxLength = 0, start = 0, n = s.length();
3235
Map<Character, Integer> indices = new HashMap<>();

src/problems/leetcode/ReverseInteger.java

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,36 @@
66
public class ReverseInteger {
77

88
public static void main(String[] args) {
9-
int x = 34056;
10-
System.out.println(reverse(x));
9+
// System.out.println(reverse(34056));
10+
System.out.println(reverse(1534236469));
1111
}
1212

13+
// runtime: O(N)
14+
// space: O(1)
1315
public static int reverse(int x) {
14-
long num = Math.abs(x), reverseNum = 0, j = 10, p = 10;
16+
if (x == 0) {
17+
return x;
18+
}
1519

16-
for (int i = 0; i < 11; i++) {
17-
long digit = (num % j) / Math.max((j / 10), 1);
18-
if (digit > 0) {
19-
reverseNum = reverseNum * p + digit;
20-
p = 10;
21-
} else {
22-
p *= 10;
20+
int n = x;
21+
if (n < 0) {
22+
n *= -1;
23+
}
24+
int y = 0;
25+
while (n > 0) {
26+
if (y > 0 && Integer.MAX_VALUE / y < 10) {
27+
return 0;
2328
}
2429

25-
j *= 10;
30+
int d = n % 10;
31+
y = d + y * 10;
32+
n /= 10;
2633
}
27-
2834
if (x < 0) {
29-
reverseNum = -reverseNum;
35+
y *= -1;
3036
}
3137

32-
return (reverseNum > Integer.MAX_VALUE || reverseNum < Integer.MIN_VALUE) ? 0 : (int) reverseNum;
38+
return y;
3339
}
3440

3541
}

src/problems/leetcode/StringToIntegerAtoi.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,44 @@
66
public class StringToIntegerAtoi {
77

88
public static void main(String[] args) {
9-
String s = "9223372036854775808";
10-
System.out.println(myAtoi(s));
9+
System.out.println(myAtoi("9223372036854775808"));
1110
}
1211

13-
public static int myAtoi(String str) {
12+
// runtime: O(N)
13+
// space: O(1)
14+
public static int myAtoi(String s) {
15+
if (s == null || s.isBlank()) {
16+
return 0;
17+
}
18+
19+
s = s.trim();
20+
int sign = 1;
21+
int start = 0;
22+
if (s.charAt(0) == '-') {
23+
sign = -1;
24+
start = 1;
25+
} else if (s.charAt(0) == '+') {
26+
start = 1;
27+
}
28+
29+
long n = 0;
30+
for (int i = start; i < s.length(); i++) {
31+
char c = s.charAt(i);
32+
if (!Character.isDigit(c)) {
33+
break;
34+
}
35+
36+
n = n * 10 + (c - '0');
37+
if (n > Integer.MAX_VALUE) {
38+
break;
39+
}
40+
}
41+
n *= sign;
42+
43+
return (int) Math.max(Math.min(n, Integer.MAX_VALUE), Integer.MIN_VALUE);
44+
}
45+
46+
public static int myAtoi2(String str) {
1447
int sign = 1, i = 0;
1548
long num = 0;
1649
while (i < str.length() && str.charAt(i) == ' ') {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package problems.leetcode;
2+
3+
import java.util.ArrayList;
4+
5+
// https://leetcode.com/problems/zigzag-conversion/
6+
public class ZigZagConversation {
7+
8+
public static String convert(String s, int numRows) {
9+
if (numRows < 2) {
10+
return s;
11+
}
12+
13+
ArrayList<ArrayList<Character>> rows = new ArrayList<ArrayList<Character>>();
14+
for (int i = 0; i < numRows; i++) {
15+
rows.add(new ArrayList<>());
16+
}
17+
18+
boolean forward = true;
19+
for (int i = 0, r = 0; i < s.length(); i++) {
20+
rows.get(r).add(s.charAt(i));
21+
if (forward) {
22+
if (r == numRows - 1) {
23+
r--;
24+
forward = false;
25+
} else {
26+
r++;
27+
}
28+
} else {
29+
if (r == 0) {
30+
r++;
31+
forward = true;
32+
} else {
33+
r--;
34+
}
35+
}
36+
}
37+
38+
StringBuilder sb = new StringBuilder();
39+
40+
for (ArrayList<Character> row : rows) {
41+
for (char c : row) {
42+
sb.append(c);
43+
}
44+
}
45+
46+
return sb.toString();
47+
}
48+
49+
public static void main(String[] args) {
50+
System.out.println(convert("PAYPALISHIRING", 3));
51+
System.out.println(convert("PAYPALISHIRING", 4));
52+
System.out.println(convert("AB", 1));
53+
}
54+
55+
}

0 commit comments

Comments
 (0)