Skip to content

Commit f11d33d

Browse files
update search in rotated sorted array
1 parent ab60371 commit f11d33d

5 files changed

+158
-42
lines changed

‎src/BinarySearch.java

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// https://leetcode.com/problems/binary-search
2+
// T: O(logN)
3+
// S: O(1)
4+
15
public class BinarySearch {
26
public int search(int[] array, int val) {
37
int left = 0, right = array.length - 1, middle;

‎src/EdmondsKarp.java

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
import java.util.Queue;
6+
7+
public class EdmondsKarp {
8+
private static int[][] adj_matrix;
9+
10+
private static int edmonds_karp(int n, int source, int sink) {
11+
int[] parent = initializeParent(n);
12+
int max_flow = 0;
13+
14+
while (bfs(n, source, sink, parent)) {
15+
int path_flow = Integer.MAX_VALUE;
16+
int s = sink;
17+
while (s != source) {
18+
path_flow = Math.min(path_flow, adj_matrix[parent[s]][s]);
19+
s = parent[s];
20+
}
21+
max_flow += path_flow;
22+
23+
int v = sink;
24+
while (v != source) {
25+
int u = parent[v];
26+
adj_matrix[u][v] -= path_flow;
27+
adj_matrix[v][u] += path_flow;
28+
v = parent[v];
29+
}
30+
31+
List<Integer> path = new ArrayList<>();
32+
v = sink;
33+
while (v != source) {
34+
path.add(v);
35+
v = parent[v];
36+
}
37+
path.add(source);
38+
path = path.reversed();
39+
System.out.println(path);
40+
41+
parent = initializeParent(n);
42+
}
43+
44+
return max_flow;
45+
}
46+
47+
private static int[] initializeParent(int n) {
48+
final int[] result = new int[n];
49+
Arrays.fill(result, -1);
50+
return result;
51+
}
52+
53+
private static boolean bfs(int n, int s, int t, int[] parent) {
54+
final boolean[] visited = new boolean[n];
55+
final Queue<Integer> queue = new LinkedList<>() {{ add(s); }};
56+
visited[s] = true;
57+
58+
while (!queue.isEmpty()) {
59+
int u = queue.poll();
60+
for (int i = 0 ; i < n ; i++) {
61+
final int value = adj_matrix[u][i];
62+
if (!visited[i] && value > 0) {
63+
queue.add(i);
64+
visited[i] = true;
65+
parent[i] = u;
66+
}
67+
}
68+
}
69+
70+
return visited[t];
71+
}
72+
}

‎src/HelloWorld.java

+25-26
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,31 @@
1-
import java.util.ArrayList;
2-
import java.util.HashMap;
3-
import java.util.HashSet;
4-
import java.util.List;
5-
import java.util.Map;
6-
import java.util.PriorityQueue;
7-
import java.util.Queue;
8-
import java.util.Set;
9-
101
public class HelloWorld {
11-
public List<List<Integer>> combinationSum(int[] candidates, int target) {
12-
final Set<List<Integer>> result = new HashSet<>();
13-
computeSums(candidates, target, result, 0, new ArrayList<>(), 0);
14-
return new ArrayList<>(result);
2+
public int search(int[] nums, int target) {
3+
final int pivotIndex = binarySearchPivotIndex(nums);
4+
final int answer = binarySearch(nums, 0, pivotIndex - 1, target);
5+
if (answer != -1) {
6+
return answer;
7+
}
8+
return binarySearch(nums, pivotIndex, nums.length - 1, target);
159
}
1610

17-
private static void computeSums(int[] candidates, int target, Set<List<Integer>> result, int currentSum, List<Integer> current, int i) {
18-
if (currentSum > target || i >= candidates.length) {
19-
return;
20-
}
21-
if (currentSum == target) {
22-
result.add(new ArrayList<>(current));
23-
return;
11+
private static int binarySearchPivotIndex(int[] array) {
12+
int left = 0, right = array.length - 1, middle;
13+
while (left <= right) {
14+
middle = left + (right - left) / 2;
15+
if (array[middle] > array[array.length - 1]) left = middle + 1;
16+
else right = middle - 1;
2417
}
18+
return left;
19+
}
2520

26-
computeSums(candidates, target, result, currentSum, current, i + 1);
27-
current.add(candidates[i]);
28-
computeSums(candidates, target, result, currentSum + candidates[i], current, i);
29-
computeSums(candidates, target, result, currentSum + candidates[i], current, i + 1);
30-
current.removeLast();
21+
private static int binarySearch(int[] array, int start, int end, int x) {
22+
int left = start, right = end, middle;
23+
while (left <= right) {
24+
middle = left + (right - left) / 2;
25+
if (array[middle] == x) return middle;
26+
else if (array[middle] < x) left = middle + 1;
27+
else right = middle - 1;
28+
}
29+
return -1;
3130
}
32-
}
31+
}

‎src/MedianOfTwoSortedArrays.java

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// https://leetcode.com/problems/median-of-two-sorted-arrays
2+
3+
public class MedianOfTwoSortedArrays {
4+
static public double findMedianSortedArrays(int[] nums1, int[] nums2) {
5+
final int[] array = merge(nums1, nums2);
6+
if (array.length % 2 == 1) {
7+
return array[array.length / 2];
8+
}
9+
return ((double) array[array.length / 2 - 1] + array[array.length / 2]) / 2;
10+
}
11+
12+
private static int[] merge(int[] array1, int[] array2) {
13+
final int[] result = new int[array1.length + array2.length];
14+
int i = 0, j = 0, k = 0;
15+
16+
while (i < array1.length && j < array2.length) {
17+
if (array1[i] <= array2[j]) {
18+
result[k++] = array1[i++];
19+
} else {
20+
result[k++] = array2[j++];
21+
}
22+
}
23+
24+
while (i < array1.length) {
25+
result[k++] = array1[i++];
26+
}
27+
28+
while (j < array2.length) {
29+
result[k++] = array2[j++];
30+
}
31+
32+
return result;
33+
}
34+
}

‎src/SearchInRotatedSortedArray.java

+23-16
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
11
// https://leetcode.com/problems/search-in-rotated-sorted-array
22
// T: O(logN)
3-
// SL O(1)
3+
// S: O(1)
44

55
public class SearchInRotatedSortedArray {
6-
int search(int[] array, int target) {
7-
final int shift = minElementIndex(array);
8-
int left = 0, right = array.length - 1, middle, realMiddle;
9-
while (left <= right) {
10-
middle = (left + right) / 2;
11-
realMiddle = (middle + shift) % array.length;
12-
if(array[realMiddle] == target) return realMiddle;
13-
if(array[realMiddle] < target) left = middle + 1;
14-
else right = middle - 1;
6+
public int search(int[] nums, int target) {
7+
final int pivotIndex = binarySearchPivotIndex(nums);
8+
final int answer = binarySearch(nums, 0, pivotIndex - 1, target);
9+
if (answer != -1) {
10+
return answer;
1511
}
16-
return -1;
12+
return binarySearch(nums, pivotIndex, nums.length - 1, target);
1713
}
1814

19-
private int minElementIndex(int[] array) {
15+
private static int binarySearchPivotIndex(int[] array) {
2016
int left = 0, right = array.length - 1, middle;
21-
while(left < right){
22-
middle = (left + right) / 2;
23-
if(array[middle] > array[right]) left = middle + 1;
24-
else right = middle;
17+
while (left <= right) {
18+
middle = left + (right - left) / 2;
19+
if (array[middle] > array[array.length - 1]) left = middle + 1;
20+
else right = middle - 1;
2521
}
2622
return left;
2723
}
24+
25+
private static int binarySearch(int[] array, int start, int end, int x) {
26+
int left = start, right = end, middle;
27+
while (left <= right) {
28+
middle = left + (right - left) / 2;
29+
if (array[middle] == x) return middle;
30+
else if (array[middle] < x) left = middle + 1;
31+
else right = middle - 1;
32+
}
33+
return -1;
34+
}
2835
}

0 commit comments

Comments
 (0)