Search in Rotated Sorted Array I

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.

二分法

复杂度

时间 O(logN) 空间 O(1)

思路

平时我们二分法的时候,直接判断下中点和目标的关系,就可以知道目标在左半部分还是右半部份了,这背后其实隐含一个假设,那就是从起点到终点是一段有序的序列。而本题中,如果我们还想继续做二分法,这个假设就不存在了,因为从起点到终点有可能有个断片!不过,旋转有序数组有一个特点,假设本身是个升序序列,从左向右。如果左边的点比右边的点小,说明这两个点之间是有序的,不存在旋转点。如果左边的点比右边的大,说明这两个点之间有一个旋转点,导致了不再有序。因为只有一个旋转点,所以一分为二后,肯定有一半是有序的。所以,我们还是可以用二分法,不过要先判断左半边有序还是右半边有序。如果左半边有序,则直接将目标和左半边的边界比较,就知道目标在不在左半边了,如果不在左半边肯定在右半边。同理,如果右半边有序,则直接将目标和右半边的边界比较,就知道目标在不在右半边了,如果不在右半边肯定在左半边。这样就完成了二分。

注意

这里要注意二分时候的边界条件,一般来说我们要找某个确定的目标时,边界条件为:

min = 0, max = length - 1;
if(min <= max){
min = mid + 1
max = mid - 1
}

另外,判断左半边是否有序的条件是:nums[min] <= nums[mid],而判断是否在某一个有序区间,则要包含那个区间较远的那一头

代码

迭代写法

public class Solution {
public int search(int[] nums, int target) {
int min = 0, max = nums.length - 1, mid = 0;
while(min <= max){
mid = (min + max) / 2;
if(nums[mid] == target){
return mid;
}
// 如果左半部分是有序的
if(nums[min] <= nums[mid]){
if(nums[min] <= target && target < nums[mid]){
max = mid - 1;
} else {
min = mid + 1;
}
// 如果右半部份是有序的
} else {
if(nums[mid] < target && target <= nums[max]){
min = mid + 1;
} else {
max = mid - 1;
}
}
}
// 不满足min <= max条件时,返回-1
return -1;
}
}

递归写法

public class Solution {
public int search(int[] nums, int target) {
return helper(nums, 0, nums.length - 1, target);
} public int helper(int[] nums, int min, int max, int target){
int mid = min + (max - min) / 2;
// 不满足min <= max条件时,返回-1
if(min > max){
return -1;
}
if(nums[mid] == target){
return mid;
}
// 如果左半部分是有序的
if(nums[min] <= nums[mid]){
// 如果在左半部分的边界内
if(nums[min] <= target && target < nums[mid]){
return helper(nums, min, mid - 1, target);
// 如果不在左半部分的边界内
} else {
return helper(nums, mid + 1, max, target);
}
// 如果右半部份是有序的
} else {
// 如果在右半部分的边界内
if(nums[mid] < target && target <= nums[max]){
return helper(nums, mid + 1, max, target);
// 如果不在右半部分的边界内
} else {
return helper(nums, min, mid - 1, target);
}
}
}
}

Search in Rotated Sorted Array II

Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

二分法

复杂度

时间 O(N) 空间 O(1)

思路

如果可能有重复,那我们之前判断左右部分是否有序的方法就失效了,因为可能有这种13111情况,虽然起点小于等于中间,但不代表右边就不是有序的,因为中点也小于等于终点,所有右边也是有序的。所以,如果遇到这种中点和两边相同的情况,我们两边都要搜索。

代码

 
public class Solution {
public boolean search(int[] nums, int target) {
return helper(nums, 0, nums.length - 1, target);
} public boolean helper(int[] nums, int min, int max, int target){
int mid = min + (max - min) / 2;
// 不符合min <= max则返回假
if(min > max){
return false;
}
if(nums[mid] == target){
return true;
}
boolean left = false, right = false;
// 如果左边是有序的
if(nums[min] <= nums[mid]){
// 看目标是否在左边有序数列中
if(nums[min] <= target && target < nums[mid]){
left = helper(nums, min, mid - 1, target);
} else {
left = helper(nums, mid + 1, max, target);
}
}
// 如果右边也是有序的
if(nums[mid] <= nums[max]){
// 看目标是否在右边有序数列中
if(nums[mid] < target && target <= nums[max]){
right = helper(nums, mid + 1, max, target);
} else {
right = helper(nums, min, mid - 1, target);
}
}
// 左右两边有一个包含目标就返回真
return left || right;
}
}

Search in Rotated Sorted Array I的更多相关文章

  1. [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

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

  2. [LeetCode] 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 ...

  3. 【leetcode】Search in Rotated Sorted Array II

    Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...

  4. 【leetcode】Search in Rotated Sorted Array

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

  5. 【leetcode】Search in Rotated Sorted Array II(middle)☆

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

  6. 49. Search in Rotated Sorted Array && Search in Rotated Sorted Array II

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

  7. Search in Rotated Sorted Array II leetcode

    原题链接,点我 该题解题参考博客 和Search in Rotated Sorted Array唯一的区别是这道题目中元素会有重复的情况出现.不过正是因为这个条件的出现,出现了比较复杂的case,甚至 ...

  8. [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索

    11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code ...

  9. LeetCode:Search in Rotated Sorted Array I II

    LeetCode:Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to y ...

随机推荐

  1. 【转】CSS清除浮动_清除float浮动

    CSS清除浮动方法集合 一.浮动产生原因 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 浮动产生样式效果截图 ...

  2. SZU-A22

    Problem(A22):Party Judge InfoMemory Limit: 32768KBCase Time Limit: 10000MSTime Limit: 10000MSJudger: ...

  3. 匈牙利命名法——命名规范(知道这些再看Windows程序就轻松多了)

    匈牙利命名法著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入前缀以增进人们对程序的理解".例如所有的字符变量 ...

  4. codeforces round #201 Div2 A. Difference Row

    #include <iostream> #include <vector> #include <algorithm> using namespace std; in ...

  5. HDU 4632 Palindrome subsequence(DP)

    题目链接 做的我很无奈,当时思路很乱,慌乱之中,起了一个想法,可以做,但是需要优化.尼玛,思路跑偏了,自己挖个坑,封榜之后,才从坑里出来,过的队那么多,开始的时候过的那么快,应该就不是用这种扯淡方法做 ...

  6. JAVA操作COOKIE

    JAVA操作COOKIE 1.设置Cookie Cookie cookie = new Cookie("key", "value"); cookie.setMa ...

  7. 李洪强-C语言5-函数

    C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确 ...

  8. OpenCV count the number of connected camera 检测连接的摄像头的数量

    有时候在项目中我们需要检测当前连接在机子上的摄像头的数量,可以通过下面的代码实现,其中连接摄像头的最大数量maxCamNum可以任意修改: /** * Count current camera num ...

  9. mysql多种方法修改密码----5.6的坑

    创建用户并授权和改密码: grant all privileges on *.* to root@'%' identified by '123456' with grant option;     * ...

  10. [转] - 经典SQL语句大全

    经典SQL语句大全 一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql serv ...