Julia's BLOG

LeetCode-33 搜索旋转排序数组

2019-02-13

1. 题面

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

1
2
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4

示例 2:

1
2
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

2. 解答

Java解答:

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
class Solution {
public int search(int[] nums, int target) {
// 方法一 时间复杂度 O(n) 遍历
// for(int i = 0;i<nums.length;i++) {
// if(nums[i] == target)
// return i;
// }
// return -1;

// 方法二 时间复杂度 O(log n) 二分查找
int low = 0;
int high = nums.length - 1;
while(low <= high) {
int mid = (low + high)/2;
double num = (target<nums[0]) == (nums[mid]<nums[0]) ? nums[mid] : target<nums[0] ? Integer.MIN_VALUE : Integer.MAX_VALUE;
System.out.println(num);
if(target > num)
low = mid + 1;
else if(target < num)
high = mid - 1;
else
return mid;
}
return -1;
}
}

JavaScript解答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
var low = 0;
var high = nums.length - 1;
while(low <= high) {
var mid = parseInt((low + high)/2);
var num = (nums[mid]<nums[0]) == (target<nums[0]) ? nums[mid] : target<nums[0] ? -Infinity : Infinity;
console.log(num);
if(target < num)
high = mid - 1;
else if(target > num)
low = mid + 1;
else
return mid;
}
return -1;
};
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章