leetcode第一刷_Search in Rotated Sorted Array

旋转数组的查找问题。从头开始扫一遍,O(N)的复杂度,一般也能过,甚至先排序以下,再二分都能过。不过这道题的目的当然不在于此。

想一下旋转之后对我们的查找产生了什么影响。如果没旋转过,我们直接比较target与A[middle]的大小,然后总能非常确定的丢掉源数组的一半,即把搜索空间减半,但是旋转之后,只根据A[middle]是确定不了下一轮的走向的,因为即使A[middle]比target大,按理说我们应该往前找,但是如果源数组是循环左移的,较小的数可能在后半部分。

上面说的都是旋转之后与没旋转的区别,这个是很容易想明白的,关键是旋转之后有什么没有变化呢?答案是无论怎么旋转,middle的左右部分肯定至少有一个是完全有序的。这个应该好理解。怎么判断这一半是哪一半也很简单,只要看A[middle]跟A[0]和A[N]的大小关系就可以了。如果有序,我们就可以通过比较端点与target的大小来确定target应不应当在这一部分,如果不在的话,就递归查询另一半。根据这个策略,就可以每次确定的丢掉一半了,时间复杂度也就降下来了。

不要忘记这个题有很强的假设,数组中没有重复的元素,有重复元素的很不一样,是下一道题的内容。

int msearch(int A[], int n, int target, int* a){
    if(n<=0)
        return -1;
    int middle = n/2;
    if(A[middle] == target)
        return A-a+middle;
    if(A[middle]>target){
        if(A[0]<=target||A[0]>A[middle]){
            return msearch(A, middle, target, a);
        }else{
            return msearch(A+middle+1, n-middle-1, target, a);
        }
    }else{
        if(A[0]<=A[middle]||A[n-1]>=target)
            return msearch(A+middle+1, n-middle-1, target, a);
        else{
            return msearch(A, middle, target, a);
        }
    }
}

class Solution {
public:
    int search(int A[], int n, int target) {
        return msearch(A, n, target, A);
    }
};

leetcode第一刷_Search in Rotated Sorted Array

时间: 2024-08-28 11:28:36

leetcode第一刷_Search in Rotated Sorted Array的相关文章

leetcode第一刷_Search in Rotated Sorted Array II

接着上一篇,同样是旋转数组中查找问题.如果这个数组有重复元素怎么办呢?会有什么影响? 我举一个极端的例子,假设数组中的元素是这样的,1,1,2,1,1,1,1,我们要在这个数组中查找2,一开始的A[middle]=1,发现比target小,那我们就看看A[0]和A[N],发现都跟A[middle]相等,那么这个2到底在哪一半中?只有上帝知道,如果他老人家真的存在的话.这种时候我们怎么办呢?没有其他的办法,只能从头开始乖乖的扫描,直到发现target或者确定他不存在. 为什么会出现这种情况,或者说

leetcode第一刷_Remove Duplicates from Sorted Array II

水题. 我之前说过包含至多几个至少几个的问题都比较难,这个题可是让我大脸了.至多可以重复一次,那就重复次数多于两次再计算重复,否则的话像普通的数据一样直接按照重复次数前移就可以了嘛.不过说归说,这种inspace的思想还是有些用处的,数组这种实现方式致命的缺点就是删除或者添加中间的元素代价太大,因为不好把握数据的最终位置.这个题是一种情况,合并两个排序好的数组也是一个例子. class Solution { public: int removeDuplicates(int A[], int n)

leetcode 题解:Search in Rotated Sorted Array II (旋转已排序数组查找2)

题目: 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. 说明: 1)和1比只是有重复的数字,整体仍采用二分查找 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 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 du

leetcode第一刷_Search for a Range

实际上也是一个二分查找的问题. 要找出范围,决定了当找到这个数时不能马上返回,如果找target最前面的那个位置,只有当这个位置等于target,且这个位置的前一个位置不等于target时,才能返回这个位置.如果找的是target最后面的那个位置,那么只有当这个位置等于target,且这个位置的后一个位置不等于target时,才会返回它.不满足返回条件时,下一次递归走什么位置也不一样,找前面的时候,小于等于都往前半走,找后面的时候,大于等于都往后半半儿找. 觉得我实现的有点丑,往前往后找其实差别

leetcode第一刷_Median of Two Sorted Arrays

这道题是我最初刷的那20多道之一,但一直没有过,被各种各样的情况折磨死了,直到把所有其他的题都写完,回来看大神对这道题是怎么处理的时候,才惊叹算法的奇妙.再次验证了我的想法,如果要处理各种各样的特殊情况,一定是算法本身有问题. 之前看过很多有关在两个排序数组中找中位数的解法,大多根据两个数组长度不同分了很多种情况,各种讨论.下面要介绍的方法并没有直接求中位数,而是把求中位数转换成了求两个数组合并之后的第(m+n)/2个数(当然根据总数的奇偶有所不同,不过思路上是没有问题的).用k来表示进入递归的

[LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值 II

Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would this affect the run-time complexity? How and why? Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might be

【LeetCode】Find Minimum in Rotated Sorted Array 在旋转数组中找最小数

Add Date 2014-10-15 Find Minimum 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). Find the minimum element. You may assume no duplicate exists in the

[Leetcode][Python]33: Search in Rotated Sorted Array

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 33: Search in Rotated Sorted Arrayhttps://oj.leetcode.com/problems/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