题目:在翻转有序中搜索

难度:Medium

题目内容

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).

翻译

假设一个按升序排序的数组在事先不知道旋转点的情况下翻转。

(即。0,1,2,4,5,6,7可能变成4,5,6,7,0,1,2)。

您获得了搜索的目标值。如果在数组中找不到它的索引,否则返回-1。

数组中不存在重复。

您的算法的运行时复杂度应该为O(log n)

我的思路:要复杂度O(log n),但是数组只是基本有序,而排序算法的最佳情况也要O(N),本弱鸡想不出什么很好方法。。。

     那就强行上吧,先插入排序一波,再二分法搜索。

     然而最后要返回下标,再排序后下标会发生变化,所以再新建一个数组存储下标,在排序过程中,此数组相应的值跟着一起移动。

MyCode

     public int search(int[] nums, int target) {
int[] index = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
index[i] = i;
}
insertSort(nums, index);
return binaryFind(nums, target, index);
} static int binaryFind(int[] nums, int target, int[] index) {
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = low + (high - low)/2;
if (nums[mid] == target) {
return index[mid];
} else if (nums[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
} static void insertSort(int[] nums, int[] index) {
for (int i = 1; i < nums.length; i++) {
int temp = nums[i];
int temp2 = index[i];
int j = i - 1;
while (j > -1 && nums[j] > temp) {
nums[j+1] = nums[j];
index[j+1] = index[j];
j--;
}
nums[j+1] = temp;
index[j+1] = temp2;
}
}

我的算法复杂度:O(N2),因为插入排序的最坏情况就是O(N2)。

编码过程中出现的问题

1、把插入排序的逻辑给忘了。。

答案代码

     public int search(int[] A, int target) {
int n = A.length;
int lo=0,hi=n-1;
while(lo<hi){
int mid=(lo+hi)/2;
if(A[mid]>A[hi]) lo=mid+1;
else hi=mid;
}
int rot=lo;
lo=0;hi=n-1;
while(lo<=hi){
int mid=(lo+hi)/2;
int realmid=(mid+rot)%n;
if(A[realmid]==target)return realmid;
if(A[realmid]<target)lo=mid+1;
else hi=mid-1;
}
return -1;
}

答案复杂度:O(logN)

答案思路:首先利用数组局部仍然有序的特点,和 A[mid]>A[hi] 的条件,以二分法定位到最小的那一个值的下标,注意当 A[mid]<=A[hi] 的时候,应该是hi=mid,因为此时的mid有可能就是最小点,所以不能放过。【当要求的点不是直接定位的mid的时候(等循环结束),mid 有可能就是最终的值,下一层的 lo 和 hi 的取值不能都把mid排除, 其中一个就是mid】

找到最小点后,记录下来,然后继续对原数组进行二分法搜索,然而,参与比较的mid应该改成realMid=(mid+rot)%n

以[4,5,6,7,0,1,2]为例,找到最小值(真起点)0的下标4后,取mid=(0+6)/2 = 3,而真正的中点下标应该等于(mid+rot)%n = (3+4)%7 = 0

之后的向左右移动是一样的,所以还是变化mid的值即可。

LeetCode第[33]题(Java):Search in Rotated Sorted Array的更多相关文章

  1. 【LeetCode每天一题】Search in Rotated Sorted Array(在旋转数组中搜索)

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

  2. LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组   中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ...

  3. 【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 migh ...

  4. leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search

    这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...

  5. LeetCode: Search in Rotated Sorted Array II 解题报告

    Search in Rotated Sorted Array II Follow up for "LeetCode: Search in Rotated Sorted Array 解题报告& ...

  6. [LeetCode] Search in Rotated Sorted Array II [36]

    称号 Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...

  7. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

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

  8. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  9. LeetCode题解33.Search in Rotated Sorted Array

    33. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some piv ...

  10. [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路

    33. Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you be ...

随机推荐

  1. Powershell Exchange Message Per Day Sent and Reveive

    Powershell Exchange Message Per Day Sent and Reveive # Initialize some variables used for counting a ...

  2. 淘宝订单数据转CSV

    <html> <body> <div id="result"> </div> <div> <textarea st ...

  3. <2014 08 28> 大学学习小结

    大一:哲学.物理(科普).瞎玩 大二:机械.力学.继续哲学 大三:电子电路.计算机.编程 大四:毕业项目(机器人等) 研一:物理.数学(常熟) 研二:AGV.TUM实习 研三:写论文.实习程序员.申请 ...

  4. centos7 Dockerfile安装nginx

    1.写一个Dockerfile文件 FROM centos MAINTAINER apeng apeng@apenglinux-002.com RUN yum install -y pcre-deve ...

  5. 总结!linux 消耗内存和cpu 定时任务

    1. c脚本 消耗内存 1)在your_directory目录下,创建文件eatmem.c ,输入以下内容 2)编译:gcc eatmem.c -o eatmem 3) 创建定时任务,每15分钟执行: ...

  6. Python 一键同步windows和linux数据(基于pscp.exe)

    outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows serv ...

  7. 前端基础-css(3)

    一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文);   /*对齐方式*/ color:色值;   /* ...

  8. nodejs升级的两种方法

    方法一: 用n升级nodejs # 全局安装n$ npm install -g n# 升级到最新稳定版$ n stable # 升级到最新版$ n latest# 升级到定制版$ n v7.10.0# ...

  9. Android Studio设置行宽、格式化断行

    设置基于Android studio 1.2,其它版本可能位置不大一样,可以直接搜索 1.设置行宽 就是那条右标准线的位置:Setting-->Editor-->Code Style,右侧 ...

  10. java 多线程 day06 threadLocal

    import java.util.HashMap;import java.util.Map;import java.util.Random; /** * Created by chengtao on ...