Leetcode704_二分查找

1.leetcode原题链接:. - 力扣(LeetCode)

2.题目描述

给定一个 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

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

3.实现方法

方法一

java 复制代码
class Solution {
   public int search(int[] nums, int target) { 
      int n=nums.length;
      // 定义初始查找范围,双指针
      int l=0;
      int r=n-1;

      if(nums[l]>target || nums[r]<target) return -1;

      while(l<=r){
          int mid=(l+r)/2;
          if(nums[mid]<target){
              l=mid+1;
          }else if(nums[mid]>target){
              r=mid-1;
          }else{
              return mid;
          }
      }

      return -1;
    }
}

方法二:递归

java 复制代码
class Solution {
   public int search(int[] nums, int target) { 
       return recursiveMethod(nums,target,0,nums.length-1); 
    }

     //方法二: 递归方法 ,增加搜索的上下界作为参数
    private int recursiveMethod(int[] nums,int target,int l,int r){
        //基本判断,当起始位置大于结束位置时,直接返回-1 ;特殊情况超出最大最小值,直接返回-1
        if(l>r || nums[l]>target || nums[r]<target) return -1;

        //计算中间位置
        int mid=(l+r)/2;

        //判断中间位置元素和target的大小关系,更改搜索范围,递归调用
        if(nums[mid]< target){
            return recursiveMethod(nums,target,mid+1,r);
        }else if(nums[mid]>target){
            return recursiveMethod(nums,target,l,mid-1);
        }else{
            return mid;
        }
    }
}
相关推荐
_GR11 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
ROBIN__dyc22 分钟前
表达式
算法
无限大.24 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw25 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上25 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
无限大.26 分钟前
c语言实例
c语言·数据结构·算法
Kenny.志28 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
六点半88830 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
不修×蝙蝠31 分钟前
八大排序--01冒泡排序
java
@haihi39 分钟前
冒泡排序,插入排序,快速排序,选择排序
数据结构·算法·排序算法