Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f11d33d

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

File tree

5 files changed

+158
-42
lines changed

5 files changed

+158
-42
lines changed

‎src/BinarySearch.java

Lines changed: 4 additions & 0 deletions
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

Lines changed: 72 additions & 0 deletions
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

Lines changed: 25 additions & 26 deletions
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

Lines changed: 34 additions & 0 deletions
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

Lines changed: 23 additions & 16 deletions
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 staticint 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)

AltStyle によって変換されたページ (->オリジナル) /