-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path33.SearchinRotatedSortedArrayII.h
More file actions
136 lines (107 loc) · 3.49 KB
/
33.SearchinRotatedSortedArrayII.h
File metadata and controls
136 lines (107 loc) · 3.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
bluepp
2014-06-23
2014-07-24
2014-08-21
May the force be with me!
Problem: Search in Rotated Sorted Array II
Source: https://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/
Notes:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
Solution: Sequence search. O(n)
Since there are duplicates, it's hard to decide which branch to go if binary-search is deployed.
*/
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1;
while (l <= r) {
int m = l + (r-l)/2;
if (nums[m] == target) {
return m;
} else if (nums[m] < nums[r]) {
if (target > nums[m] && target <= nums[r]) {
l = m+1;
} else {
r = m-1;
}
} else {
if (target >= nums[l] && target < nums[m]) {
r = m-1;
} else {
l = m+1;
}
}
}
return -1;
}
/* 2016-07-18, update binary search */
bool search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0, r = n-1;
while (l <= r)
{
int m = (l+r)/2;
if (nums[m] == target)
{
return true;
}
else if (nums[m] < nums[r])
{
if (nums[m] < target && nums[r] >= target)
{
l = m+1;
}
else
{
r = m-1;
}
}
else if (nums[m] > nums[r])
{
if (nums[l] <= target && nums[m] > target)
{
r = m-1;
}
else
{
l = m+1;
}
}
else
{
r--;
}
}
return false;
}
bool search(int a[], int n, int target) {
for (int i = 0; i < n; i++)
{
if (a[i] == target)
return true;
}
return false;
}
/* 2016-06-11, add binary search */
/* https://leetcode.com/discuss/94293/simple-c-solution-explained */
bool search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(nums[mid] == target) return true;
if(nums[mid] > nums[r]){
if(target > nums[mid] || target <= nums[r]) l = mid + 1;
else r = mid - 1;
}else if(nums[mid] == nums[r]){
r --; // may cause linear time here, e.g. [7, 8, 9, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], search for 0
}
else{
if(target <= nums[r] && target > nums[mid]) l = mid + 1;
else r = mid - 1;
}
}
return false;
}