zoukankan      html  css  js  c++  java
  • 33. Search in Rotated Sorted Array

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

    (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

    You are given a target value to search. If found in the array return its index, otherwise return -1.

    You may assume no duplicate exists in the array.

    Your algorithm's runtime complexity must be in the order of O(log n).

    Example 1:

    Input: nums = [4,5,6,7,0,1,2], target = 0
    Output: 4
    

    Example 2:

    Input: nums = [4,5,6,7,0,1,2], target = 3
    Output: -1

     1 class Solution {
     2     public int search(int[] nums, int target) {
     3         if (nums.length == 0) return -1;
     4         int l = 0, r = nums.length - 1;
     5         int n = nums.length;
     6         while (l < r) {
     7             int mid = (l + r) >> 1;
     8             if (target < nums[mid]) {
     9                 if (nums[r] > nums[l] || nums[mid] <= nums[r]) r = mid - 1;
    10                 else {
    11                     if (target <= nums[r]) l = mid + 1;
    12                     else r = mid - 1;
    13                 }
    14             } else if (target > nums[mid]) {
    15                 if (nums[r] > nums[l] || nums[mid] >= nums[l]) l = mid + 1;
    16                 else {
    17                     if (target <= nums[r]) {
    18                         l = mid + 1;
    19                     } else {
    20                         r = mid - 1;
    21                     }
    22                 }
    23             } else {
    24                 return mid;
    25             }
    26         }
    27         if (l >= n || r < 0) return -1;
    28         return nums[l] == target ? l: -1;
    29     }
    30 }
     1 class Solution {
     2     public int search(int[] nums, int target) {
     3         if (nums.length == 0) return -1;
     4         int n = nums.length;
     5         int l = 0, r = n - 1;
     6         while (l < r) {
     7             int mid = (l + r) >> 1;
     8             if (nums[mid] > nums[r]) {
     9                 l = mid + 1;
    10             } else {
    11                 r = mid;
    12             }
    13         }
    14         System.out.println(l);
    15         int offset = l;
    16         l = 0;
    17         r = n - 1;
    18         while (l < r) {
    19             int mid = (l + r) >> 1;
    20             //System.out.println(l + " " + mid + " " + r);
    21             if (target < nums[(mid + offset) % n]) {
    22                 r = mid - 1;
    23             } else if(target > nums[(mid + offset) % n]) {
    24                 l = mid + 1;
    25                 
    26             } else {
    27                 return (mid + offset) % n;
    28             }
    29         }
    30         
    31         return nums[(l + offset) % n] == target ? (l + offset) % n : -1;
    32         
    33     }
    34 }
     1 class Solution {
     2     public int check(int[] nums, int target, int s, int e) {
     3         
     4         
     5         int l = s, r = e;
     6         while (l < r) {
     7             int mid = (l + r) >> 1;
     8             if (target < nums[mid]) {
     9                 r = mid - 1;
    10             } else if (target > nums[mid]) {
    11                 l = mid + 1;
    12                 
    13             } else {
    14                 return mid;
    15             }
    16         }
    17         
    18         System.out.println("l = " + l);
    19         return nums[l] == target ? l : -1;
    20         
    21     }
    22     public int search(int[] nums, int target) {
    23         int n = nums.length;
    24         if (n == 0) return -1;
    25         int l = 0, r = n - 1;
    26         while (l < r) {
    27             int mid = (l + r) >> 1;
    28             if (nums[l] < nums[mid]) {
    29                 int temp = check(nums, target, l, mid);
    30                 if (temp != -1) {
    31                     return temp;
    32                 } else {
    33                     l = mid + 1;
    34                 }
    35             } else {
    36                 int temp = check(nums, target, mid + 1, r);
    37                 if (temp != -1) {
    38                     return temp;
    39                 } else {
    40                     r = mid;
    41                 }
    42             }
    43         }
    44         return nums[l] == target ? l : -1;
    45         
    46     }
    47 }
  • 相关阅读:
    [Leetcode] Merge Intervals
    [Leetcode] Sort Colors
    junit
    DBUnit的使用
    xml简介---来自百度百科
    今天开始深入学习XML
    Java 用Myeclipse部署项目基础坏境搭建
    properties配置文件读取方法
    Java web做服务器之间的通信方法
    Java Socket简单的客服端及其服务器端
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/12310006.html
Copyright © 2011-2022 走看看