算法--复杂度

搜索旋转排序数组
第十一章 32

假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7 可能成为 4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。
你可以假设数组中不存在重复的元素。
样例:
给出[4, 5, 1, 2, 3]和 target=1,返回 2
给出[4, 5, 1, 2, 3]和 target=0,返回 -1

解题思路:
采用了二分搜索,不过旋转后的数组要讨论的情况增多了。其实旋转后的数组的大小关系一般如下图:先通过中点与左顶点的关系来分类讨论中点落在了哪一部分,如果在左半边,则继续讨论目标数在中点的左边还是右边;如果在右半边,同样讨论目标数的位置。同时需要注意特殊情况只剩下两个数时,例如[3,1],这时求出的中点也是 3,如果中点不匹配,应考虑 1。这种情况不好与上面的情况合并,单独列出。

算法--复杂度_第1张图片

// An highlighted block
class Solution:
    def search(self,A,target):
        left,right = 0,len(A)-1
        while left<=right:
            mid =(left+right)//2

            #mid左端是排好序的
            if A[mid] == target:

                return mid
            if A[mid] >= A[left]:
                #因为
                if A[mid]> target and A[left]<= target:
                    right = mid-1
                else:
                    left=mid+1
            else:
                if A[mid]<target and A[right]>=target:
                    left = mid+1
                else:
                    right=mid-1
        return -1

if __name__ =='__main__':
    a = Solution()
    A= [4,4,5,1,2,3]
    target = 2
    print(a.search(A,target))

思考:
其他条件不变,假如有重复元素又将如何?是否会影响运行时间复杂度?如何影响?为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
样例:
给出[3,4,4,5,7,0,1,2]和 target=4,返回 true。

----2020/3/12

----算术表达式a+b*(c+d/e)转为后缀表达式后为()
正确答案: B
ab+cde/*
abcde/++
abcde/
++
abcde*/++
解析:。。。。。。。。
算法--复杂度_第2张图片
算法--复杂度_第3张图片

----下列序排算法中最坏复杂度不是n(n-1)/2的是?
正确答案: D
快速排序
冒泡排序
直接插入排序
堆排序

解析:D,堆排序的时间复杂不会超过n*lgn

----希尔排序算法的时间复杂度为 O(n2) 。 ( )
正确答案: B

正确
错误
解析:希尔排序在最坏情况下为On的平方,当n在某个特定范围时,约为On的1.3次方

----下列排序算法的常规实现中,哪些空间复杂度是O(1)
正确答案: A B E
冒泡
选择
归并
快排
堆排序
解析:。。。。

你可能感兴趣的:(算法--数据结构)