day7.26——二分查找

问题:二分查找

问题描述:

给定一个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;
    }
}
posted @ 2021-07-27 23:47  头秃准备  阅读(46)  评论(0)    收藏  举报