Skip to content

Commit 8e8280a

Browse files
committed
search_in_rotated_sorted_array_II
1 parent 5285006 commit 8e8280a

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ Golang solution for leetcode. For each problem, there is a simple *_test.go to t
7070
#### [78. subsets](https://github.com/hitzzc/go-leetcode/tree/master/subsets)
7171
#### [79. word search(not solved)](https://github.com/hitzzc/go-leetcode/tree/master/word_search)
7272
#### [80. Remove Duplicates from Sorted Array II](https://github.com/hitzzc/go-leetcode/tree/master/remove_duplicates_from_sorted_array_II)
73+
#### [81. Search in Rotated Sorted Array II](https://github.com/hitzzc/go-leetcode/tree/master/search_in_rotated_sorted_array_II)
7374

7475

7576

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package search_in_rotated_sorted_array_II
2+
3+
func search(nums []int, target int) bool {
4+
if len(nums) == 0 {
5+
return false
6+
}
7+
if len(nums) == 1 {
8+
if nums[0] == target {
9+
return true
10+
}
11+
return false
12+
}
13+
return search1(nums, target, 0, len(nums)-1) != -1
14+
}
15+
16+
func search1(nums []int, target int, left, right int) int {
17+
if left > right {
18+
return -1
19+
}
20+
if left == right {
21+
if nums[left] == target {
22+
return left
23+
}
24+
return -1
25+
}
26+
mid := left + (right-left)/2
27+
if nums[mid] == target {
28+
return mid
29+
}
30+
if nums[left] < nums[mid] && nums[left] <= target && target < nums[mid] {
31+
return binarySearch(nums, target, left, mid-1)
32+
}
33+
if nums[mid] < nums[right] && nums[mid] < target && target <= nums[right] {
34+
return binarySearch(nums, target, mid+1, right)
35+
}
36+
if nums[left] > nums[mid] {
37+
return search1(nums, target, left, mid-1)
38+
}
39+
if nums[mid] > nums[right] {
40+
return search1(nums, target, mid+1, right)
41+
}
42+
if nums[left] == nums[mid] && nums[mid] == nums[right] {
43+
for ; left < right && nums[left] == nums[left+1]; left++ {
44+
}
45+
for ; left < right && nums[right] == nums[right-1]; right-- {
46+
}
47+
return search1(nums, target, left, right)
48+
}
49+
return -1
50+
}
51+
52+
func binarySearch(nums []int, target, left, right int) int {
53+
if left > right {
54+
return -1
55+
}
56+
if left == right {
57+
if nums[left] == target {
58+
return left
59+
}
60+
return -1
61+
}
62+
mid := left + (right-left)/2
63+
if nums[mid] == target {
64+
return mid
65+
}
66+
if nums[left] <= target && target < nums[mid] {
67+
return binarySearch(nums, target, left, mid-1)
68+
}
69+
if nums[mid] < target && target <= nums[right] {
70+
return binarySearch(nums, target, mid+1, right)
71+
}
72+
return -1
73+
}

0 commit comments

Comments
 (0)