Skip to content

Commit ddf6445

Browse files
refactor 81
1 parent 3f44e8c commit ddf6445

File tree

1 file changed

+39
-157
lines changed
  • src/main/java/com/fishercoder/solutions

1 file changed

+39
-157
lines changed

src/main/java/com/fishercoder/solutions/_81.java

Lines changed: 39 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -4,171 +4,53 @@
44
* 81. Search in Rotated Sorted Array II
55
*
66
* Follow up for "Search in Rotated Sorted Array":
7+
*
78
* What if duplicates are allowed?
89
* Would this affect the run-time complexity? How and why?
910
* Write a function to determine if a given target is in the array.
1011
*/
1112
public class _81 {
1213

13-
public static class Solution1 {
14-
public boolean search(int[] A, int target) {
15-
int len = A.length;
16-
if (len == 0) {
17-
return false;
18-
}
19-
if (len == 1) {
20-
if (A[0] == target) {
21-
return true;
22-
} else {
23-
return false;
24-
}
25-
}
26-
int watershed = A[0];
27-
int watershedIndex = 0;
28-
for (int i = 0; i < len - 1; i++) {
29-
if (A[i] > A[i + 1]) {
30-
watershed = A[i];
31-
watershedIndex = i;
32-
System.out.println("Place 1: watershed = " + watershed
33-
+ "\twatershedIndex = " + watershedIndex);
34-
for (int j = i + 1; j < len; j++) {
35-
if (A[j] == A[i]) {
36-
watershed = A[j];
37-
watershedIndex = j;
38-
System.out.println("Place 2: watershed = " + watershed
39-
+ "\twatershedIndex = " + watershedIndex);
40-
} else {
41-
break;
42-
}
43-
}
44-
}
45-
}
46-
System.out.println("watershed = " + watershed + "\twatershedIndex = "
47-
+ watershedIndex);
48-
if (target == watershed) {
49-
return true;
50-
} else if (target > watershed) {
51-
/*
52-
* here is the tricky part: when target is greater than watershed,
53-
* it's also possible that this list is ZERO rotated, i.e. it didn't
54-
* rotate at all! Then at this moment, watershed is not the largest
55-
* element int this array, so we need to binary search this whole
56-
* array.
57-
*/
58-
if (watershedIndex == 0) {
59-
int start = 0;
60-
int end = len - 1;
61-
int mid = (start + end) / 2;
62-
while (start <= end) {
63-
if (target > A[mid]) {
64-
start = mid + 1;
65-
mid = (start + end) / 2;
66-
} else if (target < A[mid]) {
67-
end = mid - 1;
68-
mid = (start + end) / 2;
69-
} else if (target == A[mid]) {
70-
return true;
71-
}
72-
}
73-
return false;
74-
} else {
75-
return false;
76-
}
77-
} else if (target < watershed) {
78-
/*
79-
* target could be in either part of this sorted array, then we
80-
* check if target is greater than A[0], if so, then search in the
81-
* first part, if not, then check if it is greater than A[len - 1],
82-
* if so, return -1, if not, search in the second part
83-
*/
84-
85-
if (target == A[0]) {
86-
return true;
87-
} else if (target > A[0]) {
88-
int start = 1;
89-
int end = watershedIndex - 1;
90-
int mid = (start + end) / 2;
91-
while (start <= end) {
92-
if (target > A[mid]) {
93-
start = mid + 1;
94-
mid = (start + end) / 2;
95-
} else if (target < A[mid]) {
96-
end = mid - 1;
97-
mid = (start + end) / 2;
98-
} else if (target == A[mid]) {
99-
return true;
100-
}
101-
}
102-
return false;
103-
} else if (target < A[0]) {
104-
if (target == A[len - 1]) {
105-
return true;
106-
} else if (target > A[len - 1]) {
107-
return false;
108-
} else if (target < A[len - 1]) {
109-
int start = watershedIndex + 1;
110-
int end = len - 2;
111-
int mid = (start + end) / 2;
112-
while (start <= end) {
113-
if (target > A[mid]) {
114-
start = mid + 1;
115-
mid = (start + end) / 2;
116-
} else if (target < A[mid]) {
117-
end = mid - 1;
118-
mid = (start + end) / 2;
119-
} else if (target == A[mid]) {
120-
return true;
121-
}
122-
}
123-
return false;
124-
}
125-
}
126-
}
127-
return false;
14+
public static class Solution1 {
15+
public boolean search(int[] nums, int target) {
16+
int start = 0;
17+
int end = nums.length - 1;
18+
19+
//check each num so we will check start == end
20+
//We always get a sorted part and a half part
21+
//we can check sorted part to decide where to go next
22+
while (start <= end) {
23+
int mid = start + (end - start) / 2;
24+
if (nums[mid] == target) {
25+
return true;
12826
}
129-
}
130-
131-
public static class Solution2 {
132-
public boolean search(int[] nums, int target) {
133-
int start = 0;
134-
int end = nums.length - 1;
135-
136-
//check each num so we will check start == end
137-
//We always get a sorted part and a half part
138-
//we can check sorted part to decide where to go next
139-
while (start <= end) {
140-
int mid = start + (end - start) / 2;
141-
if (nums[mid] == target) {
142-
return true;
143-
}
144-
145-
//if left part is sorted
146-
if (nums[start] < nums[mid]) {
147-
if (target < nums[start] || target > nums[mid]) {
148-
//target is in rotated part
149-
start = mid + 1;
150-
} else {
151-
end = mid - 1;
152-
}
153-
} else if (nums[start] > nums[mid]) {
154-
//right part is rotated
155-
156-
//target is in rotated part
157-
if (target < nums[mid] || target > nums[end]) {
158-
end = mid - 1;
159-
} else {
160-
start = mid + 1;
161-
}
162-
} else {
163-
//duplicates, we know nums[mid] != target, so nums[start] != target
164-
//based on current information, we can only move left pointer to skip one cell
165-
//thus in the worst case, we would have target: 2, and array like 11111111, then
166-
//the running time would be O(n)
167-
start++;
168-
}
169-
}
17027

171-
return false;
28+
//if left part is sorted
29+
if (nums[start] < nums[mid]) {
30+
if (target < nums[start] || target > nums[mid]) {
31+
//target is in rotated part
32+
start = mid + 1;
33+
} else {
34+
end = mid - 1;
35+
}
36+
} else if (nums[start] > nums[mid]) {
37+
//right part is rotated
38+
39+
//target is in rotated part
40+
if (target < nums[mid] || target > nums[end]) {
41+
end = mid - 1;
42+
} else {
43+
start = mid + 1;
44+
}
45+
} else {
46+
//duplicates, we know nums[mid] != target, so nums[start] != target
47+
//based on current information, we can only move left pointer to skip one cell
48+
//thus in the worst case, we would have target: 2, and array like 11111111, then
49+
//the running time would be O(n)
50+
start++;
17251
}
52+
}
53+
return false;
17354
}
55+
}
17456
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy