• Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)


    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置;你可以假设在数组中没有重复值出现

    举例:

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

    在旋转后的数组中查找6,则返回index =2. 若查找10,则返回index= -1;

    解题思路:

    由于数组中没有重复出现的数字,因此旋转后的数组基本可以划分为两部分;因此解题思路可以转换为我们熟悉的二分查找;但是在二分查找时我们需要注意,到底在哪边查找?

    1) 假设此时在[start, end]之间查找,则mid = (start + end) / 2;此时有三种情况,即nums[mid] > target, nums[mid] < target, nums[mid] = target;

    2)   nums[mid] > target这种情况下,如何缩小start或者end的范围呢?

       a)     456789123, nums[mid] = 8, target =2,  此时判断条件应当是nums[start] > nums[end](表示将原数组将数组划分为两部分,第一部分是升序,第二部分也是升序)&& nums[mid] > = nums[start](表示[start, mid]之间的数是一个严格的升序) && target < nums[start](表示所求的值在第二部分的升序中),此时将所有的条件整合起来,则可判断要找的值一定在后半段,即start = mid + 1;否则end = mid -1

    3)  nums[mid] < target的情况用同样的方法去除一半

    但是要注意每次缩小的一半一定是一个升序或者降序;

    代码如下:

     1 public class Solution {
     2     public int search(int[] nums, int target) {
     3         int start = 0;
     4         int end = nums.length - 1;
     5         int mid = 0;
     6         while(start <= end)
     7         {
     8             mid = (start + end) / 2;
     9             if(target < nums[mid])
    10             {
    11                 if(nums[start] > nums[end] && nums[mid] >= nums[start] && target < nums[start]) //  456789123, target =2 , 第一次舍弃掉45676
    12                     start = mid + 1;
    13                 else
    14                     end = mid - 1;
    15             }
    16             else if(target > nums[mid])
    17             {
    18                 if(nums[start] > nums[end] && nums[mid] < nums[end] && target > nums[end]) // 7812345, target= 8; 舍弃掉2345
    19                     end = mid - 1;
    20                 else
    21                     start = mid + 1;
    22             }
    23             else // 4567123, target=7
    24                 return mid;
    25         }
    26         
    27         return -1;
    28         
    29     }
    30 }
  • 相关阅读:
    快速排序算法
    DirectX9(翻译):介绍
    奇葩的面试题
    新博客
    OpenCV2:幼儿园篇 第八章 视频操作
    编程规范:位运算
    编程规范:allocator
    深浅copy和浅copy
    模块和包
    递归函数
  • 原文地址:https://www.cnblogs.com/leavescy/p/5898039.html
Copyright © 2020-2023  润新知