題目描述:
給定一個 n
個元素有序的(升序)整型數組 nums
和一個目標值 target
,寫一個函數搜索 nums
中的 target
,如果目標值存在返回下標,否則返回 -1。
示例1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標爲 4
示例2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
提示:
- 你可以假設
nums
中的所有元素是不重複的。 n
將在[1, 10000]
之間。nums
的每個元素都將在[-9999, 9999]
之間。
方法:二分查找
二分查找是一種基於比較目標值和數組中間元素的教科書式算法。
- 如果目標值等於中間元素,則找到目標值。
- 如果目標值較小,繼續在左側搜索。
- 如果目標值較大,則繼續在右側搜索。
算法:
- 初始化指針
left = 0
,right = n - 1
。 - 當
left <= right
:- 比較中間元素
nums[pivot]
和目標值target
。- 如果
target = nums[pivot]
,返回pivot
。 - 如果
target < nums[pivot]
,則在左側繼續搜索right = pivot - 1
。 - 如果
target > nums[pivot]
,則在右側繼續搜索left = pivot + 1
。
- 如果
- 比較中間元素
/**
* @Author 庭前雲落
* @Date 2021/6/30 10:55
* @Description
*/
public class Solution {
public int search(int[] nums,int target){
int pivot,left = 0,right = nums.length-1;
while(left<=right){
pivot = left + (right - left)/2;
if(nums[pivot]== target) return pivot;
if(target < nums[pivot]) right = pivot -1;
else left = pivot +1;
}
return -1;
}
}