zoukankan      html  css  js  c++  java
  • LeetCode 702. Search in a Sorted Array of Unknown Size

    原题链接在这里:https://leetcode.com/problems/search-in-a-sorted-array-of-unknown-size/

    题目:

    Given an integer array sorted in ascending order, write a function to search target in nums.  If target exists, then return its index, otherwise return -1. However, the array size is unknown to you. You may only access the array using an ArrayReader interface, where ArrayReader.get(k) returns the element of the array at index k (0-indexed).

    You may assume all integers in the array are less than 10000, and if you access the array out of bounds, ArrayReader.get will return 2147483647.

    Example 1:

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

    Example 2:

    Input: array = [-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 the array are unique.
    2. The value of each element in the array will be in the range [-9999, 9999].

    题解:

    The range of index could not be over 20000. Because element raget is [-9999, 9999].

    Guess the index using binary search, and call the reader.get() on the guess index.

    If the return value cur > target, it could be either there is no such index, return is Integer.MAX_VALUE, or it exists, but value is larger. Either way, should continue guessing smaller index.

    If cur < target, should continue guessing larger index.

    If cur == target, return the guess index.

    Time Complexity: O(logn). n = 20000.

    Space:O(1).

    AC Java:

     1 class Solution {
     2     public int search(ArrayReader reader, int target) {
     3         int l = 0;
     4         int r = 20000;
     5         while(l <= r){
     6             int mid = l + (r-l)/2;
     7             int cur = reader.get(mid);
     8             if(cur > target){
     9                 r = mid-1;
    10             }else if(cur < target){
    11                 l = mid+1;
    12             }else{
    13                 return mid;
    14             }
    15         }
    16         
    17         return -1;
    18     }
    19 }

    Could use candidate call to get r. while (reader.get(r) < target). r *=2.

    Then target index should be (r/2,r].

    Time Complexity: O(logn).

    Space: O(1).

    AC Java: 

     1 class Solution {
     2     public int search(ArrayReader reader, int target) {
     3         int r = 1;
     4         while(reader.get(r) < target){
     5             r = r << 1;
     6         }
     7         
     8         int l = r >> 1;
     9         while(l <= r){
    10             int mid = l + (r-l)/2;
    11             int cur = reader.get(mid);
    12             if(cur > target){
    13                 r = mid-1;
    14             }else if(cur < target){
    15                 l = mid+1;
    16             }else{
    17                 return mid;
    18             }
    19         }
    20         
    21         return -1;
    22     }
    23 }

    类似Binary Search.

  • 相关阅读:
    构造函数和析构函数
    关联[2]
    关联模型[1]
    auth 权限控制
    多语言设置
    文件上传
    验证码
    图像处理
    Session 与 Cookie
    控制器[3]
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11921844.html
Copyright © 2011-2022 走看看