LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找

原创 2013年12月02日 08:24:08

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.

我突然想用英文解说下,展示一下我英文解说这么专业主题的功力O(∩_∩)O~,都搞双语的话好像又太费时间了。

This is a classic interview question. It's solution is similar with normal binary search. The only difference is that we need to add more conditional sentences.

和普通的二分法差不多

The key points is when we divide the array into two half, we need to compare A[mid] with one of the end element of the array, so that we can know which half of the array is sorted, and which half is rotated, and divided them again subsequently.

关键是会增加条件判断

The difference I do here is that I add one normal binary search here as  a helper function. Actually you don't need the binary search function, just one function will be alright. But that's fun to add them together to check the difference between them.

增加普通的binary search对比一下

 

class Solution {
public:
	int search(int A[], int n, int target) 
	{
		return unordBiSearch(A, 0, n-1, target);
	}

	int unordBiSearch(int A[], int low, int up, int tar)
	{
		if (low > up) return -1;
		
		int mid = (low+up)>>1;
		if (A[mid] == tar)
			return mid;
		if (A[mid]>A[up])
		{
			if (A[low] <= tar && A[mid] > tar)
				return biSearch(A, low, mid-1, tar);
			else return unordBiSearch(A, mid+1, up, tar);
		}
		if (A[mid]<A[up])
		{
			if (A[mid] < tar && A[up] >= tar)
				return biSearch(A, mid+1, up, tar);
			else return unordBiSearch(A, low, mid-1, tar);
		}
		return -1;
	}

	int biSearch(int A[], int low, int up, int key)
	{
		if(low>up) return -1;  
		int mid = (low+up)>>1;  
		if (key < A[mid])  
			return biSearch(A, low, mid-1, key);  
		else if (A[mid] < key)  
			return biSearch(A, mid+1, up, key);  
		return mid; 
	}
};


 

 

//2014-1-26 update
	int search(int A[], int n, int target) 
	{
		return biSearch(A, 0, n-1, target);
	}

	int biSearch(int A[], int low, int up, int tar)
	{
		if (low > up) return -1;
		int mid = low + ((up-low)>>1);
		if (tar == A[mid]) return mid;

		if (A[low] <= A[mid])
		{
			//容易错漏了A[low]<=tar的条件,容易遗漏等号
			if (A[low] <= tar && tar < A[mid]) return biSearch(A, low, mid-1, tar);
			else return biSearch(A, mid+1, up, tar);
		}
		else
		{
			//容易错漏
			if (A[mid] < tar && tar <= A[up]) return biSearch(A, mid+1, up, tar);
			else return biSearch(A, low, mid-1, tar);
		}
		return -1;
	}

 

 

版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者允许不得转载。

循环有序数组中的二分查找 Search in a rotated sorted array

二分查找是必须要掌握的技能。二分查找适用于有序的、顺序的存储结构。 1、可以用它来查找某一个数 2、可以用于查找某一个范围。如《二分查找有序数组中某个数的所在范围 Search for a Rang...
  • luckyjoy521
  • luckyjoy521
  • 2013年12月22日 19:16
  • 2134

【LeetCode-面试算法经典-Java实现】【189-Rotate Array(旋转数组)】

【189-Rotate Array(旋转数组)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Rotate an array of n elements to the r...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月24日 07:13
  • 3065

LeetCode总结--二分查找篇

二分查找算法虽然简单,但面试中也比较常见,经常用来在有序的数列查找某个特定的位置。在LeetCode用到此算法的主要题目有: Search Insert Position Search for a...
  • linhuanmars
  • linhuanmars
  • 2014年06月16日 10:50
  • 13470

Leetcode全树类问题

Leetcode全树类问题。算法总的来说就是递归(Stack, DFS)和广度优先(Queue, BFS)两种。下面有关二叉树类linked list的题目,若不加特别说明......
  • wangxiaojun911
  • wangxiaojun911
  • 2014年02月04日 03:03
  • 8674

leetcode 刷题之路 35 Search in Rotated Sorted Array II (旋转排序数组查找终极版)

Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affec...
  • u013140542
  • u013140542
  • 2014年08月01日 09:46
  • 412

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述  写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:    每一行从左到右递增。 每一列从上到下递增。 2. 方法与思路2.1 二分查找法 ...
  • Jeanphorn
  • Jeanphorn
  • 2015年07月23日 20:41
  • 3118

Rotated Sorted Array(旋转数组总结)

首先什么叫旋转数组,把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转。对于这样的数组,我们可以画一下的一个图来表示。 ...
  • willduan1
  • willduan1
  • 2016年12月17日 09:50
  • 4722

leetcode解题之33&81. Search in Rotated Sorted Array java版(在旋转的数字中查找指定值)

33. Search in Rotated Sorted Array ,81. Search in Rotated Sorted Array II 。 leetcode解题之33&81. Search...
  • mine_song
  • mine_song
  • 2017年04月09日 22:58
  • 239

Leetcode刷题记—— 33. Search in Rotated Sorted Array(在翻转顺序的数组里查找)

一、题目叙述: Suppose a sorted array is rotated at some piv...
  • sunshine0_0
  • sunshine0_0
  • 2017年01月04日 22:02
  • 90

Rotated Array 旋转数组的解题报告--leetcode

Rotated Array即旋转数组的定义是:将一个有序数组的某个位置k之后的子数组移动到数组前面,是原数组的前半部分和后半部分都是有序的。例如:0,1,2,3,4,5,6,取k=4,则旋转之后的数组...
  • y999666
  • y999666
  • 2016年08月28日 10:56
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
举报原因:
原因补充:

(最多只允许输入30个字)