二分法 查找

2020-06-18 18:20 更新

题目

给定一个 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]之间。

经典解法

1.引入开头start=0,end=nums.length-1

2.因为是升序,所以如果中间的值也就是 half=start+(end-start)/2;nums[half]大于target的话说明target在half的后面,所以让start=half+1从后半段中寻找

同理,小于的时候从end=half-1前半段查找

3.直到找到返回下标,如果没有找到就会产生start>end,跳出while

class Solution {
    public int search(int[] nums, int target) {
        int start=0,end=nums.length-1;
        int half=0;  
        while(start<=end){
            half=start+(end-start)/2;
        if(nums[half]==target) return half;
        else if(nums[half]<target) start =half +1;
        else if(nums[half]>target) end =half -1;
       }
       return -1;   
    }

  
}

解法二:Python

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 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

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号