• 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 }
  • 相关阅读:
    simpleParallax.js(为网站图片创建视觉差效果)
    Toast UI Editor(编辑器允许您使用文本或所见即所得编辑您的标记文档,并带有语法突出显示、滚动同步、实时预览和图表功能。)
    javascript 或 Typescript 从网页元素创建 .docx 文件
    nvidia apex Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 131072.0
    11. ASM _asm_hbeatiowait问题
    rocketmq broker启动报错,找不到或无法加载主类
    EXTJS7 监听AJAX异步上传文件进度
    spring boot文件上传失败 SizeLimitExceededException
    spring security 使用自定义AuthenticationFailureHandler无法跳转failureUrl
    redis 解除本地连接限制
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/12310006.html
Copyright © 2020-2023  润新知