在未知大小的有序数组中搜索。题干即是题意,给一个有序数组但是不告知数组长度,请找一个target数字。例子,
Example 1:
Input:array
= [-1,0,3,5,9,12],target
= 9 Output: 4 Explanation: 9 exists innums
and its index is 4Example 2:
Input:array
= [-1,0,3,5,9,12],target
= 2 Output: -1 Explanation: 2 does not exist innums
so return -1
思路是用二分法。先设一个变量high,因为不确定input数组的长度所以只能每次乘以二去试探high位置上的数字和target数字的大小关系。
时间O(logn)
空间O(1)
JS实现
1 /** 2 * @param {ArrayReader} reader 3 * @param {number} target 4 * @return {number} 5 */ 6 var search = function (reader, target) { 7 let hi = 1; 8 while (reader.get(hi) < target) { 9 hi = hi << 1; 10 } 11 let low = hi >> 1; 12 while (low <= hi) { 13 let mid = Math.floor(low + (hi - low) / 2); 14 if (reader.get(mid) > target) { 15 hi = mid - 1; 16 } else if (reader.get(mid) < target) { 17 low = mid + 1; 18 } else { 19 return mid; 20 } 21 } 22 return -1; 23 };
Java实现
1 class Solution { 2 public int search(ArrayReader reader, int target) { 3 int hi = 1; 4 while (reader.get(hi) < target) { 5 hi = hi << 1; 6 } 7 int low = hi >> 1; 8 while (low <= hi) { 9 int mid = low + (hi - low) / 2; 10 if (reader.get(mid) > target) { 11 hi = mid - 1; 12 } else if (reader.get(mid) < target) { 13 low = mid + 1; 14 } else { 15 return mid; 16 } 17 } 18 return -1; 19 } 20 }