Skip to content

Commit 6269155

Browse files
committed
二分: 旋转数组找数
Change-Id: I459a62c352c8f3a8ccf51b0623db91351297dce6
1 parent f7c1529 commit 6269155

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* @lc app=leetcode.cn id=81 lang=golang
3+
*
4+
* [81] 搜索旋转排序数组 II
5+
*
6+
* https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/
7+
*
8+
* algorithms
9+
* Medium (34.13%)
10+
* Likes: 64
11+
* Dislikes: 0
12+
* Total Accepted: 10.7K
13+
* Total Submissions: 31.4K
14+
* Testcase Example: '[2,5,6,0,0,1,2]\n0'
15+
*
16+
* 假设按照升序排序的数组在预先未知的某个点上进行了旋转。
17+
*
18+
* ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
19+
*
20+
* 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
21+
*
22+
* 示例 1:
23+
*
24+
* 输入: nums = [2,5,6,0,0,1,2], target = 0
25+
* 输出: true
26+
*
27+
*
28+
* 示例 2:
29+
*
30+
* 输入: nums = [2,5,6,0,0,1,2], target = 3
31+
* 输出: false
32+
*
33+
* 进阶:
34+
*
35+
*
36+
* 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。
37+
* 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
38+
*
39+
*
40+
*/
41+
42+
/*
43+
* 二分查找加上判断旋转点
44+
* 可以判断左中右三个点的关系判断旋转点,左小于中一直递增,左大于中存在旋转点
45+
*/
46+
// package leetcode
47+
48+
// @lc code=start
49+
func search(nums []int, target int) bool {
50+
length := len(nums)
51+
if length <= 0 {
52+
return false
53+
}
54+
left, right := 0, length-1
55+
for left <= right {
56+
mid := left + (right-left)/2
57+
if nums[left] == target || nums[right] == target || nums[mid] == target {
58+
return true
59+
}
60+
// 当中点==左边界的时候,有可能是[1,3,1,1]的情况,右边界左移一位一直到可以继续位置
61+
if nums[mid] == nums[left] {
62+
right--
63+
continue
64+
}
65+
if nums[mid] > nums[left] { // 旋转点在右侧
66+
if target > nums[left] && target < nums[mid] { // 目标点在左侧
67+
right = mid - 1
68+
} else {
69+
left = mid + 1
70+
}
71+
continue
72+
}
73+
// 旋转点在左侧
74+
if target > nums[mid] && target < nums[right] { // 目标点在右侧
75+
left = mid + 1
76+
} else {
77+
right = mid - 1
78+
}
79+
}
80+
return false
81+
}
82+
83+
// @lc code=end

0 commit comments

Comments
 (0)