Skip to content

Commit 310a666

Browse files
committed
33.搜索旋转排序数组,二分查找
1 parent 41cd5ac commit 310a666

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
22. 括号生成
1313
25. K 个一组翻转链表
1414
31. 下一个排列
15+
33. 搜索旋转排序数组
1516
37. 解数独
1617
39. 组合总和
1718
40. 组合总和 II

leetcode_Java/Solution0033.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// 33. 搜索旋转排序数组
2+
3+
4+
/*
5+
直接遍历查找,时间复杂度O(n)
6+
*/
7+
class Solution {
8+
public int search(int[] nums, int target) {
9+
for (int i = 0; i < nums.length; i++) {
10+
if (nums[i] == target) {
11+
return i;
12+
}
13+
}
14+
return -1;
15+
}
16+
}
17+
18+
19+
/*
20+
二分查找:时间复杂度O(logn)
21+
1、左右索引求和除以2,得到中点索引,如果中点索引对应值为目标值,则返回中点索引
22+
2、在常规二分查找的时候查看当前 mid 为分割位置分割出来的两个部分 [l, mid-1] 和 [mid+1, r] 哪个部分是有序的,并判断 target 是否在有序的部分,从而决定改变二分查找的上下界
23+
如果 [l, mid-1] 是有序数组,且 target 的大小满足 nums[left] <= target < nums[mid] ,则到 [l, mid-1]寻找,否则在 [mid+1, r] 寻找
24+
如果 [mid+1, r] 是有序数组,且 target 的大小满足 nums[mid] < target <= nums[right],则到 [mid+1, r]寻找,否则在 [l, mid-1] 寻找
25+
*/
26+
class Solution {
27+
public int search(int[] nums, int target) {
28+
int n = nums.length;
29+
if (n == 0) {
30+
return -1;
31+
}
32+
if (n == 1) {
33+
return nums[0] == target ? 0 : -1;
34+
}
35+
int left = 0, right = n - 1;
36+
// 可能最后只剩下一个数要判断,所以需要等号
37+
while (left <= right) {
38+
int mid = (left + right) / 2;
39+
if (nums[mid] == target) {
40+
return mid;
41+
}
42+
// 当剩下两个数时,left=mid,由于上面nums[mid]=nums[left]已经校验过不等于target,所以当前数要舍弃,期望左指针右移,所以需要等号,使if条件成立进入里面的逻辑
43+
if (nums[left] <= nums[mid]) { // 左半部分有序
44+
// nums[left]还没判断过,所以需要等号。上面nums[mid]单独判断过了,所以不用等号。
45+
if (nums[left] <= target && target < nums[mid]) {
46+
right = mid - 1;
47+
} else {
48+
left = mid + 1;
49+
}
50+
} else { // 右半部分有序
51+
if (nums[mid] < target && target <= nums[right]) {
52+
left = mid + 1;
53+
} else {
54+
right = mid - 1;
55+
}
56+
}
57+
}
58+
return -1;
59+
}
60+
}

0 commit comments

Comments
 (0)