问题:二分查找
问题描述:
给定一个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]之间。
思路:
- 给定一个n元素的数组,这个数组符合题目的要求;
- 这道题用到二分查找法,该数组是有序的序列,实现起来也比较简单;
- 有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。
- 将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
代码:
public class Erfen {
public static void main(String[] args) {
int[] nums = new int[] {-1,0,3,5,7,12};
int target = 9;
int a = search(nums, target);
System.out.println(a);
}
public static int search(int[] nums, int target) {
int i = 0;
int len = nums.length - 1;
while(i <= len){
int mid = (i +len) / 2;
if(nums[mid] == target){
return mid;
}
else if(nums[mid] > target){
len = mid - 1;
}
else{
i = mid +1;
}
}
return -1;
}
}