zoukankan      html  css  js  c++  java
  • [leetcode] Binary Search

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1.


    Example 1:

    Input: nums = [-1,0,3,5,9,12], target = 9
    Output: 4
    Explanation: 9 exists in nums and its index is 4
    
    

    Example 2:

    Input: nums = [-1,0,3,5,9,12], target = 2
    Output: -1
    Explanation: 2 does not exist in nums so return -1
    

    Note:

    1. You may assume that all elements in nums are unique.
    2. n will be in the range [1, 10000].
    3. The value of each element in nums will be in the range [-9999, 9999].

     分析:二分查找,要注意使用二分查找,数组必须是有序的。是一个必备的技能了。有递归版本和非递归版本。这里要注意无论是递归还是非递归,结束的条件都是low>high。代码如下:
          非递归:
     1 class Solution {
     2     public int search(int[] nums, int target) {
     3         return helper(nums,target,0,nums.length-1);
     4     }
     5     private int helper(int[] nums, int target, int low, int high) {
     6         while ( low <= high ){
     7             int mid = ( low + high ) / 2;
     8             if ( nums[mid] == target ) return mid;
     9             if ( nums[mid] < target ) low = mid + 1;
    10             if ( nums[mid] > target ) high = mid - 1;
    11         }
    12         return -1;
    13     }
    14 }

          运行时间2ms。


          递归版本:

     1 class Solution {
     2     public int search(int[] nums, int target) {
     3         return digui(nums,target,0,nums.length-1);
     4     }
     5     private int digui(int[] nums, int target, int low, int high){
     6         if ( low > high ) return -1;
     7         int mid = ( low + high ) / 2;
     8         if ( nums[mid] == target ) return mid;
     9         if ( nums[mid] < target )  return digui(nums,target,mid+1,high);
    10         else return digui(nums,target,low,mid-1);
    11     }
    12 }

          运行时间也是2ms。

     
          Java jdk中已经内置好了二分查找的api:binarySearch(int[] a, int fromIndex, int toIndex, int key);
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/boris1221/p/9303679.html
Copyright © 2011-2022 走看看