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.

    假设按照升序排列的数组在事先未知的某个关键点上旋转。(即0 1 2 4 5 6 7可能变成4 5 6 7 0 1 2)。给你一个目标值来搜索。如果在数组中发现它返回其索引,否则返回-1。你可能会认为数组中没有重复。

    (1)思想1:直接遍历数组,找到索引值,如果未找到,则返回-1

     1 class Solution {
     2 public:
     3     int search(vector<int>& nums, int target) {
     4        for(int i=0;i<len;i++)
     5         {
     6             if(nums[i]==target)
     7                 return i;
     8         }
     9         return -1;
    10     }
    11 };

    (2)思想2:使用二分法进行查找,二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,通过观察得出规律,如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了,代码如下:

     1 class Solution {
     2 public:
     3     int search(vector<int>& nums, int target) {
     4         int len=nums.size();
     5         int begin=0;
     6         int end=len-1;
     7         while(begin<=end)
     8         {
     9             int mid=begin+(end-begin)/2;
    10             if(nums[mid]==target)
    11                 return mid;
    12             else if(nums[mid]<nums[end])
    13             {
    14                 if(nums[mid]<target && nums[end]>=target)
    15                     begin=mid+1;
    16                 else
    17                     end=end-1;
    18             }
    19             else
    20             {
    21                 if(nums[mid]>target && nums[begin]<=target)
    22                     end=mid-1;
    23                 else
    24                     begin=begin+1;
    25             }
    26             
    27         }
    28         return -1;
    29     }
    30 };
  • 相关阅读:
    Fiddler-常用技巧
    Fiddler-工作原理
    C语言-EOF和feof()判断文件结尾的区别
    C语言-一个fopen函数中未使用二进制模式(b)引发的血案
    VIM-不常用或不知道的技巧
    C语言-srand种子详解
    C语言-字符串操作函数
    C语言-Makefile经典教程(掌握这些足够)
    分布拟合——正态/拉普拉斯/对数高斯/瑞利 分布
    曲线拟合——(2)拉普拉斯/瑞利/对数正态 曲线
  • 原文地址:https://www.cnblogs.com/sword-/p/7987250.html
Copyright © 2011-2022 走看看