1.題目
給定一個(gè) n 個(gè)元素有序的(升序)整型數(shù)組 nums 和一個(gè)目標(biāo)值 target 忘渔,寫一個(gè)函數(shù)搜索 nums 中的 target备恤,如果目標(biāo)值存在返回下標(biāo)稿饰,否則返回 -1。
示例 1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標(biāo)為 4
示例 2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
提示:
你可以假設(shè) nums 中的所有元素是不重復(fù)的露泊。
n 將在 [1, 10000]之間喉镰。
nums 的每個(gè)元素都將在 [-9999, 9999]之間。
2.知識(shí)點(diǎn)
二分查找思路:針對(duì)于有序的數(shù)組先找到數(shù)組的中間值,若需要查找的數(shù)據(jù)比中間值大, 則向數(shù)組的右半部分查找,再通過(guò)右半部分中間值,比較需要找的元素大小,進(jìn)而縮小查找區(qū)間,最后完成查找惭笑。
二分查找法只適用于從有序的數(shù)列中進(jìn)行查找(比如數(shù)字和字母等)侣姆,將數(shù)列排序后再進(jìn)行查找,二分查找法的運(yùn)行時(shí)間為對(duì)數(shù)時(shí)間O(㏒?n) 沉噩,即查找到需要的目標(biāo)位置最多只需要㏒?n步捺宗,假設(shè)從[0,99]的隊(duì)列(100個(gè)數(shù),即n=100)中尋到目標(biāo)數(shù)30川蒙,則需要查找步數(shù)為㏒?100 ,
即最多需要查找7次( 2^6 < 100 < 2^7)
3.代碼
3.1 scala 代碼
object Solution {
def search(nums: Array[Int], target: Int): Int = {
var left = 0
var right = nums.length - 1
while(left<=right){
val mid = left+(right - left)/2
val midVal = nums(mid)
if(target>midVal)
left = mid + 1
else if(target<midVal)
right = mid - 1
else
return mid
}
return -1
}
}
3.2 java代碼
class Solution {
public int search(int[] nums, int target) {
int left = 0 ;
int right = nums.length - 1 ;
while(left<=right){
int mid = (left + right)/2 ;
int midVal = nums[mid];
if(target>midVal)
left = mid + 1 ;
else if (target<midVal)
right = mid - 1 ;
else
return mid ;
}
return -1 ;
}
}