題目
描述
給定一個排序的整數數組(升序)和一個要查找的整數target
,用O(logn)
的時間查找到target第一次出現的下標(從0開始),如果target不存在于數組中,返回-1
。
樣例
在數組[1, 2, 3, 3, 4, 5, 10]
中二分查找3
,返回2
。
解答
思路
基礎題。解釋見注釋。
代碼
class Solution {
/**
* @param nums: The integer array.
* @param target: Target to find.
* @return: The first position of target. Position starts from 0.
*/
public int binarySearch(int[] nums, int target) {
//write your code here
//從兩頭往中間遍歷
int low = 0, high = nums.length;
//直到兩個游標相遇
while(low <= high){
//比較位于中間的數和目標數
int middle = (high + low) / 2;
//若位于中間的數等于目標數
if(nums[middle] == target){
//若中間游標為0,返回0
if(middle == 0) return (0);
//注意,題中要求出現的第一次,因此要往前回溯
else{
while(nums[middle - 1] == target) middle--;
//返回第一次出現的位置
return middle;
}
}
//若中位數大于目標數,右游標設為中間位置右邊
if(nums[middle] > target) high = middle - 1;
//若中文數小于目標書,左游標設為中間位置左邊
else low = middle + 1;
}
//沒有找到,返回-1
return (-1);
}
}