Skip to content

Commit a21142d

Browse files
author
rchen102
committed
review
1 parent 81ee05e commit a21142d

8 files changed

+146
-101
lines changed

Java/leetcode 153.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,25 @@ class Solution {
66
public int findMin(int[] nums) {
77
if (nums == null || nums.length == 0) return 0;
88
int lo = 0, hi = nums.length - 1;
9-
int mid;
109
while (lo < hi) {
11-
mid = lo + (hi-lo)/2;
12-
if (nums[mid] > nums[hi]) lo = mid + 1;
13-
else hi = mid;
10+
if (nums[lo] < nums[hi]) return nums[lo];
11+
int mid = lo + ((hi - lo) >> 1);
12+
if (nums[mid] >= nums[lo]) lo = mid + 1;
13+
else if (nums[mid] < nums[lo]) hi = mid;
14+
}
15+
return nums[lo];
16+
}
17+
}
18+
19+
class Solution {
20+
public int findMin(int[] nums) {
21+
if (nums == null || nums.length == 0) return 0;
22+
int lo = 0, hi = nums.length - 1;
23+
while (lo < hi) {
24+
if (nums[lo] < nums[hi]) return nums[lo];
25+
int mid = lo + ((hi - lo) >> 1);
26+
if (nums[mid] < nums[hi]) hi = mid;
27+
else if (nums[mid] > nums[hi]) lo = mid + 1;
1428
}
1529
return nums[lo];
1630
}

Java/leetcode 154.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
1-
//Solution1: traverse T: O(n) S: O(1)
1+
// Solution1: Binary Search
2+
// T: O(n)(worst) O(logn)(best) S: O(1)
23
class Solution {
34
public int findMin(int[] nums) {
4-
for(int i = 1 ; i < nums.length; i++) {
5-
if(nums[i] < nums[i-1])
6-
return nums[i];
5+
if (nums == null || nums.length == 0) return 0;
6+
int lo = 0, hi = nums.length - 1;
7+
while (lo < hi) {
8+
if (nums[lo] < nums[hi]) return nums[lo];
9+
int mid = lo + ((hi - lo) >> 1);
10+
if (nums[mid] < nums[hi]) hi = mid;
11+
else if (nums[mid] > nums[hi]) lo = mid + 1;
12+
else {
13+
// nums[mid] == nums[hi]
14+
if (nums[hi-1] > nums[hi]) return nums[hi];
15+
hi--;
16+
}
717
}
8-
return nums[0];
18+
return nums[lo];
919
}
1020
}
1121

12-
//Solution2: binary search T: O(n)(worst) O(logn)(best) S: O(1)
22+
// Solution2: traverse T: O(n) S: O(1)
1323
class Solution {
1424
public int findMin(int[] nums) {
15-
int left = 0;
16-
int right = nums.length - 1;
17-
while(left < right) {
18-
int mid = (left + right)/2;
19-
if(nums[mid] < nums[right])
20-
right = mid;
21-
else if(nums[mid] > nums[right])
22-
left = mid + 1;
23-
else
24-
right--;
25+
for(int i = 1 ; i < nums.length; i++) {
26+
if(nums[i] < nums[i-1])
27+
return nums[i];
2528
}
26-
return nums[left];
27-
}
29+
return nums[0];
30+
}
2831
}
2932

30-
//Solution3: remove the duplicate elements T: O(n) S: O(n)
33+
34+
// Solution3: remove the duplicate elements T: O(n) S: O(n)
3135
class Solution {
3236
public int findMin(int[] nums) {
3337
Set<Integer> set = new HashSet<>();

Java/leetcode 167.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@
33
*/
44
class Solution {
55
public int[] twoSum(int[] numbers, int target) {
6-
int[] list = new int[2];
7-
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
8-
for(int i = 0; i < numbers.length; i++) {
9-
if(map.containsKey(target - numbers[i])) {
10-
list[1] = i + 1;
11-
list[0] = map.get(target - numbers[i]);
12-
return list;
6+
int[] res = new int[2];
7+
if (numbers == null || numbers.length == 0) return res;
8+
int left = 0, right = numbers.length - 1;
9+
while (left < right) {
10+
int sum = numbers[left] + numbers[right];
11+
if (sum > target) right--;
12+
else if (sum < target) left++;
13+
else {
14+
res[0] = left + 1;
15+
res[1] = right + 1;
16+
return res;
1317
}
14-
map.put(numbers[i], i + 1);
1518
}
16-
return list;
19+
return res;
1720
}
1821
}

Java/leetcode 209.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@
44
class Solution {
55
public int minSubArrayLen(int s, int[] nums) {
66
if (nums == null || nums.length == 0) return 0;
7-
int minLen = Integer.MAX_VALUE;
87
int left = 0, right = 0;
9-
int tmpSum = 0;
8+
int sum = 0, minLen = nums.length + 1;
109
while (right < nums.length) {
11-
tmpSum += nums[right];
12-
while (tmpSum >= s) {
13-
minLen = Math.min(minLen, right - left + 1);
14-
tmpSum -= nums[left];
15-
left++;
10+
sum += nums[right];
11+
if (sum >= s) {
12+
while (sum >= s) {
13+
minLen = Math.min(minLen, right - left + 1);
14+
sum -= nums[left];
15+
left++;
16+
}
17+
right++;
18+
}
19+
else {
20+
right++;
1621
}
17-
right++;
1822
}
19-
if (minLen == Integer.MAX_VALUE) return 0;
20-
return minLen;
23+
if (minLen <= nums.length) return minLen;
24+
return 0;
2125
}
2226
}
2327

Java/leetcode 3.java

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,32 @@
1-
/* Solution: sliding window + HashMap
1+
/* Solution: sliding window + set
22
* T: O(n) S: O(1)
33
*/
44
class Solution {
55
public int lengthOfLongestSubstring(String s) {
6-
Map<Character, Integer> map = new HashMap<>(); // helper data structure to check duplicate
7-
int maxLen = 0;
8-
int left = 0, right = 0;
6+
if (s == null || s.length() == 0) return 0;
7+
int left = 0, right = 0; // sliding window
8+
int res = 0;
9+
Set<Character> set = new HashSet<>();
910
while (right < s.length()) {
1011
char ch = s.charAt(right);
11-
if (!map.containsKey(ch)) {
12-
maxLen = Math.max(maxLen, right - left + 1);
13-
map.put(ch, 1);
12+
if (!set.contains(ch)) {
13+
set.add(ch);
14+
res = Math.max(res, set.size());
1415
right++;
15-
}
16-
else {
17-
while (map.containsKey(ch)) {
18-
char tmp = s.charAt(left);
19-
map.remove(tmp);
16+
} else {
17+
while (set.contains(ch)) {
18+
set.remove(s.charAt(left));
2019
left++;
2120
}
2221
}
2322
}
24-
return maxLen;
23+
return res;
2524
}
2625
}
2726

28-
27+
/* Solution: sliding window + array -> hashmap
28+
* T: O(n) S: O(1)
29+
*/
2930
class Solution {
3031
public int lengthOfLongestSubstring(String s) {
3132
int[] map = new int[256];

Java/leetcode 74.java

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,43 @@
44
*/
55
class Solution {
66
public boolean searchMatrix(int[][] matrix, int target) {
7-
if (matrix == null) return false;
8-
int row = matrix.length;
9-
if (row == 0) return false;
10-
int col = matrix[0].length;
11-
if (col == 0) return false;
12-
13-
int lo = 0, hi = row - 1;
14-
int mid;
7+
if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) return false;
8+
// column search -> log(m)
9+
int lo = 0, hi = matrix.length - 1;
1510
while (lo <= hi) {
16-
mid = lo + (hi-lo)/2;
17-
if (matrix[mid][0] == target) return true;
18-
else if (matrix[mid][0] > target) hi = mid - 1;
11+
int mid = lo + ((hi - lo) >> 1);
12+
if (matrix[mid][0] > target) hi = mid - 1;
1913
else if (matrix[mid][0] < target) lo = mid + 1;
14+
else return true;
2015
}
21-
int targetRow = lo - 1;
22-
if (targetRow < 0) return false;
23-
16+
int row = lo - 1;
17+
if (row < 0) return false;
18+
// row search -> log(n)
2419
lo = 0;
25-
hi = col - 1;
20+
hi = matrix[row].length - 1;
2621
while (lo <= hi) {
27-
mid = lo + (hi-lo)/2;
28-
if (matrix[targetRow][mid] == target) return true;
29-
else if (matrix[targetRow][mid] > target) hi = mid - 1;
30-
else if (matrix[targetRow][mid] < target) lo = mid + 1;
22+
int mid = lo + ((hi - lo) >> 1);
23+
if (matrix[row][mid] > target) hi = mid - 1;
24+
else if (matrix[row][mid] < target) lo = mid + 1;
25+
else return true;
26+
}
27+
return false;
28+
}
29+
}
30+
31+
/**
32+
* Solution1: BST
33+
* T: O(log(row * col)) S: O(1)
34+
*/
35+
class Solution {
36+
public boolean searchMatrix(int[][] matrix, int target) {
37+
if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) return false;
38+
int row = matrix.length, col = matrix[0].length;
39+
int i = 0, j = col - 1;
40+
while (i < row && j >= 0) {
41+
if (matrix[i][j] > target) j--;
42+
else if (matrix[i][j] < target) i++;
43+
else return true;
3144
}
3245
return false;
3346
}

Java/leetcode 75.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,26 @@ class Solution {
55
public void sortColors(int[] nums) {
66
if (nums == null || nums.length == 0) return;
77
int left = 0, right = nums.length - 1;
8-
int cur = 0;
9-
while (cur <= right) {
10-
if (nums[cur] == 2) {
11-
nums[cur] = nums[right];
12-
nums[right] = 2;
13-
right--;
14-
}
15-
else if (nums[cur] == 0) {
16-
nums[cur] = nums[left]; // we can guarantee nums[left] can not be 2
17-
nums[left] = 0;
8+
int i = 0;
9+
while (i <= right) {
10+
if (nums[i] == 0) {
11+
swap(nums, i, left);
1812
left++;
19-
cur++;
2013
}
21-
else cur++;
14+
else if (nums[i] == 2) {
15+
swap(nums, i, right);
16+
right--;
17+
i--; // re-process the nums[i], since it can be zero after swap
18+
}
19+
i++;
2220
}
2321
}
22+
23+
private void swap(int[] nums, int i, int j) {
24+
int tmp = nums[i];
25+
nums[i] = nums[j];
26+
nums[j] = tmp;
27+
}
2428
}
2529

2630
/* Solution2: traverse and count

Java/leetcode 88.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
/* Solution1: Two Pointers
2-
* T: O(n) S: O(1)
2+
* T: O(m+n) S: O(1)
33
*/
44
class Solution {
55
public void merge(int[] nums1, int m, int[] nums2, int n) {
6-
int i = m-1;
7-
int j = n-1;
8-
int k = m + n - 1;
9-
while (k >= 0 && i >= 0 && j >= 0) {
10-
if (nums1[i] > nums2[j]) {
11-
nums1[k] = nums1[i];
12-
i--;
6+
if (nums1 == null || nums2 == null) return;
7+
int cur = m + n - 1;
8+
m = m - 1;
9+
n = n - 1;
10+
while (m >= 0 && n >= 0) {
11+
if (nums1[m] > nums2[n]) {
12+
nums1[cur] = nums1[m];
13+
cur--;
14+
m--;
15+
} else {
16+
nums1[cur] = nums2[n];
17+
cur--;
18+
n--;
1319
}
14-
else {
15-
nums1[k] = nums2[j];
16-
j--;
17-
}
18-
k--;
1920
}
20-
while (j >= 0) nums1[k--] = nums2[j--];
21+
//while (m >= 0) nums1[cur--] = nums1[m--]; // no need, actually
22+
while (n >= 0) nums1[cur--] = nums2[n--];
2123
}
2224
}
2325

0 commit comments

Comments
 (0)