Skip to content

Commit eabc11a

Browse files
aQuaaQua
aQua
authored and
aQua
committed
adding Problem 33
在学习最快的答案
1 parent d9774d5 commit eabc11a

File tree

2 files changed

+22
-79
lines changed

2 files changed

+22
-79
lines changed
Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,38 @@
11
package Problem0033
22

33
func search(nums []int, target int) int {
4-
if len(nums) == 0 {
4+
var index, indexOfMax int
5+
6+
length := len(nums)
7+
8+
if length == 0 {
59
return -1
610
}
711

8-
if nums[len(nums)-1] > nums[0] {
9-
return searchInt(nums, target, 0)
12+
for indexOfMax+1 < length && nums[indexOfMax] < nums[indexOfMax+1] {
13+
indexOfMax++
1014
}
1115

12-
base := searchMax(nums) + 1
13-
res := searchInt(nums[:base], target, 0)
14-
if res != -1 {
15-
return res
16-
}
17-
res = searchInt(nums[base:], target, base)
18-
if res != -1 {
19-
return res
20-
}
16+
lo, hi, median := 0, length-1, 0
17+
for lo <= hi {
18+
median = (lo + hi) / 2
2119

22-
return -1
23-
}
20+
relativeIndex := median + indexOfMax + 1
21+
if relativeIndex < length {
22+
index = relativeIndex
23+
} else {
24+
index = relativeIndex - length
25+
}
2426

25-
func searchInt(nums []int, target, base int) (index int) {
26-
lo, hi := 0, len(nums)-1
27-
for lo <= hi {
28-
index = (lo + hi) / 2
2927
switch {
3028
case nums[index] > target:
31-
hi = index - 1
29+
hi = median - 1
3230
case nums[index] < target:
33-
lo = index + 1
31+
lo = median + 1
3432
default:
35-
return base + index
33+
return index
3634
}
3735
}
38-
return -1
39-
}
40-
41-
func searchMax(nums []int) (index int) {
42-
i, j := 0, len(nums)-1
4336

44-
for {
45-
index = (i + j) / 2
46-
if index == 0 || index == len(nums)-1 {
47-
return
48-
}
49-
if index > 0 && index < len(nums)-1 && nums[index] > nums[index-1] && nums[index] > nums[index+1] {
50-
return
51-
}
52-
if nums[index] > nums[i] {
53-
i = index
54-
} else {
55-
j = index
56-
}
57-
}
37+
return -1
5838
}

Algorithms/0033.search-in-rotated-sorted-array/search-in-rotated-sorted-array_test.go

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ func Test_Problem0033(t *testing.T) {
3131
qs := []question{
3232

3333
question{
34-
para{[]int{4, 5, 6, 7, 0, 1, 2}, 5},
34+
para{[]int{4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2}, 5},
3535
ans{1},
3636
},
3737

3838
question{
39-
para{[]int{6, 7, 0, 1, 2,3,4,5}, 1},
39+
para{[]int{6, 7, 0, 1, 2, 3, 4, 5}, 1},
4040
ans{3},
4141
},
4242

@@ -70,40 +70,3 @@ func Test_Problem0033(t *testing.T) {
7070
ast.Equal(a.one, search(p.one, p.two), "输入:%v", p)
7171
}
7272
}
73-
func Test_searchInt(t *testing.T) {
74-
var actual, expected int
75-
ast := assert.New(t)
76-
77-
actual = searchInt([]int{3, 4}, 4, 0)
78-
expected = 1
79-
ast.Equal(expected, actual)
80-
81-
actual = searchInt([]int{3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 4, 0)
82-
expected = 1
83-
ast.Equal(expected, actual)
84-
}
85-
func Test_searchMax(t *testing.T) {
86-
var actual, expected int
87-
ast := assert.New(t)
88-
89-
actual = searchMax([]int{9, 1, 2, 3, 4, 5, 6, 7, 8})
90-
expected = 0
91-
ast.Equal(expected, actual)
92-
93-
actual = searchMax([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0})
94-
expected = 8
95-
ast.Equal(expected, actual)
96-
97-
actual = searchMax([]int{4, 5, 6, 7, 0, 1, 2})
98-
expected = 3
99-
ast.Equal(expected, actual)
100-
101-
actual = searchMax([]int{1, 0})
102-
expected = 0
103-
ast.Equal(expected, actual)
104-
105-
actual = searchMax([]int{0})
106-
expected = 0
107-
ast.Equal(expected, actual)
108-
109-
}

0 commit comments

Comments
 (0)