題目
給定一個?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。
首先,給出暴力解法
class Solution {public int search(int[] nums, int target) {for(int i = 0;i < nums.length;i++){//循環nums數組,尋找targetif(nums[i] == target){return i;//找到則返回下標,數組下標從0開始} }return -1;//退出循環仍沒有返回,則說明沒有找到,則返回-1}
}
其次,二分法解法[i,j)
class Solution {public int search(int[] nums, int target) {int i = 0;// 初始化變量 i 為 0,i 代表當前查找范圍的左邊界索引int j = nums.length;// 初始化變量 j 為數組 nums 的長度,j 代表當前查找范圍的右邊界索引while(i < j){// 當左邊界索引 i 小于右邊界索引 j 時,持續循環查找int m = (i+j) >>>1;// 計算當前查找范圍的中間索引 m// 使用無符號右移運算符 >>> 進行整除操作,確保結果為整數if(target > nums[m]){i = m+1;// 則將左邊界索引 i 更新為 m + 1,縮小查找范圍到右半部分}else if(target < nums[m]){j = m;// 則將右邊界索引 j 更新為 m,縮小查找范圍到左半部分}else{return m;}}return -1;// 若循環結束仍未找到目標值,返回 -1 表示未找到}
}
[i,j]
class Solution {public int search(int[] nums, int target) {int i = 0;// 初始化變量 i 為 0,i 代表當前查找范圍的左邊界索引int j = nums.length-1;// 初始化變量 j 為數組 nums 的長度,j 代表當前查找范圍的右邊界索引while(i <= j){// 當左邊界索引 i 小于等于右邊界索引 j 時,持續循環查找int m = (i+j) >>>1;// 計算當前查找范圍的中間索引 m// 使用無符號右移運算符 >>> 進行整除操作,確保結果為整數if(target > nums[m]){i = m+1;// 則將左邊界索引 i 更新為 m + 1,縮小查找范圍到右半部分}else if(target < nums[m]){j = m-1;// 則將右邊界索引 j 更新為 m - 1,縮小查找范圍到左半部分}else{return m;}}return -1;// 若循環結束仍未找到目標值,返回 -1 表示未找到}
}