ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二分法应用——搜索旋转数组,以前一直在纠结a[0],a[-1],a[mid], target三者关系,其实最简单的还是使用2次二分,先找到旋转数组peak,然后用正常的二分搜索即可!

2022-06-03 17:34:03  阅读:146  来源: 互联网

标签:二分 return target mid start 搜索 数组 integer


62 · 搜索旋转排序数组     描述

给定一个有序数组,但是数组以某个元素作为支点进行了旋转(比如,0 1 2 4 5 6 7 可能成为4 5 6 7 0 1 2)。给定一个目标值target进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。你可以假设数组中不存在重复的元素。

背完这套刷题模板,真的不一样!

样例

样例 1:

输入:

数组 = [4, 5, 1, 2, 3]
target = 1

输出:

2

解释:

1在数组中对应索引位置为2。

样例 2:

输入:

数组 = [4, 5, 1, 2, 3]
target = 0

输出:

-1

解释:

0不在数组中,返回-1。

挑战

O(logN) 时间限制

 

from typing import (
    List,
)

class Solution:
    """
    @param a: an integer rotated sorted array
    @param target: an integer to be searched
    @return: an integer
    """
    def search(self, a: List[int], target: int) -> int:
        # write your code here        
        def find_peak():
            l, r = 0, len(a) - 1
            while l < r - 1:
                mid = (l + r) >> 1
                if a[mid] > a[0]:
                    l = mid
                else:
                    r = mid
            
            if a[l] < a[r]:
                return r
            return  l

        def bin_search(l, r):            
            while l < r - 1:
                mid = (l + r) >> 1
                if a[mid] < target:
                    l = mid
                else:
                    r = mid
                        
            if a[l] == target:
                return l
            if a[r] == target:
                return r
            
            return -1

        if not a:
            return -1        

        if a[0] <= a[-1]:
            return bin_search(0, len(a)-1)

        peak = find_peak()    
#在前半段搜索 if a[0] <= target <= a[peak]: return bin_search(0, peak)
#在后半段搜索 return bin_search(peak+1, len(a)-1)

逻辑非常简单清晰!!!不要再去用以前那种复杂的解法了。。。几个关系给你整蒙逼!!!

 

比如下面这种,就是用到夹逼的思想:

从两边不断靠近target的值。

class Solution:
    """
    @param A: an integer rotated sorted array
    @param target: an integer to be searched
    @return: an integer
    """
    def search(self, A, target):
        if not A:
            return -1
            
        start, end = 0, len(A) - 1
        while start + 1 < end:
            mid = (start + end) // 2
            if A[mid] >= A[start]:
                if A[start] <= target <= A[mid]:
                    end = mid
                else:
                    start = mid
            else:
                if A[mid] <= target <= A[end]:
                    start = mid
                else:
                    end = mid
                    
        if A[start] == target:
            return start
        if A[end] == target:
            return end
        return -1

 

            if A[mid] >= A[start]:
                if A[start] <= target <= A[mid]: ==》表示在左半边升序部分

else: if A[mid] <= target <= A[end]:==》表示在右半边升序部分

要求逻辑分析非常严谨。。。



 

 

标签:二分,return,target,mid,start,搜索,数组,integer
来源: https://www.cnblogs.com/bonelee/p/16340266.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有