zoukankan      html  css  js  c++  java
  • 【Leetcode】【Hard】Search in Rotated Sorted Array

    Suppose a sorted array 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.

    解题:

    二分搜索的应用,可以有两种思路:

    (1)将数列从mid处划分,按照前半段序列顺序正常,或者不正常,进行条件判断,达到log(n)的二分效果;

    (2)将数列从mid处划分,比较mid处元素和target,按照mid元素大,或者mid元素小,进行条件判断,达到log(n)的二分效果;

    代码实现1:

    代码简介,灵活的运用的二分的思想,将正常/非正常作为二分标准,而不是mid值大还是小。

     1 class Solution {
     2 public:
     3     int search(vector<int>& nums, int target) {
     4         int start = 0;
     5         int end = nums.size() - 1;
     6         while (start <= end) {
     7             int mid = (start + end) / 2;
     8             if (nums[mid] == target) 
     9                 return mid;
    10             if (nums[start] <= nums[mid]) {
    11                 if (nums[start] <= target && target <= nums[mid])
    12                     end = mid - 1;
    13                 else 
    14                     start = mid + 1;
    15             } else {
    16                 if (nums[mid] <= target && target <= nums[end])
    17                     start = mid + 1;
    18                 else
    19                     end = mid - 1;
    20             }
    21         }
    22         
    23         return -1;   
    24     }
    25 };

    代码实现2:

    思路更常规,虽然代码不如1简介,但是逻辑更好理解。

     1 class Solution {
     2 public:
     3     int search(vector<int>& nums, int target) {
     4         int left = 0;
     5         int right = nums.size() - 1;
     6         while (left < right) {
     7             int mid = (left + right) / 2;
     8             if (nums[mid] > target) {
     9                 if (nums[left] <= target || nums[left] > nums[mid])
    10                     right = mid;
    11                 else
    12                     left = mid + 1;
    13             } else if (nums[mid] == target) {
    14                 left = mid;
    15                 break;
    16             } else {
    17                 if (nums[right] >= target || nums[mid] > nums[right])
    18                     left = mid + 1;
    19                 else
    20                     right = mid;
    21             }
    22         }
    23         
    24         if (nums[left] == target)
    25             return left;
    26         else 
    27             return -1;
    28     }
    29 };
  • 相关阅读:
    [转]SVN服务器搭建和使用(二)
    [转]SVN服务器搭建和使用(一)
    BZOJ 2049 Sdoi2008 Cave 洞穴勘测
    BZOJ 1589 Usaco2008 Dec Trick or Treat on the Farm 采集糖果
    BZOJ 2796 POI2012 Fibonacci Representation
    BZOJ 2115 Wc2011 Xor
    BZOJ 3105 CQOI2013 新Nim游戏
    BZOJ 2460 Beijing2011 元素
    BZOJ 3687 简单题
    BZOJ 1068 SCOI2008 压缩
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4413415.html
Copyright © 2011-2022 走看看