旋转数组中的元素查找

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组中的元素查找相关的知识,希望对你有一定的参考价值。

参考技术A 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小元素为1。

题目:在旋转数组中搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。假定数组中没有重复元素。

参考 https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/ji-bai-liao-9983de-javayong-hu-by-reedfan/

取区间的中间值mid后:

题目:在旋转数组中搜索一个给定的目标值,如果数组中存在这个目标值,则返回true,否则返回false。数组中可能存在重复元素。

思路基本同上题,只是要考虑到[1,0,1,1,1] 和 [1,1,1,0,1]的情况:

旋转数组最小值二分查找法

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

# -*- coding:utf-8 -*-

class Solution:

    def minNumberInRotateArray(self, rotateArray):

        # write code here

        #利用二分查找法查找时,若right < middle ,则意味着右侧数据违背了元素递增的规律,即最小值一定在Middle往后的数据中,left = mid +1

        #若right > middle,则意味着middle之后的数据是递增规律,则最小值一定在middle的前面,即right = middle-1


        if not rotateArray:

            return 0

        l = len(rotateArray)

        left = 0

        right = l-1

        while left <= right:

            mid =(left + right)>>1     

            if rotateArray[mid-1]>rotateArray[mid]:

                return rotateArray[mid]

            elif rotateArray[mid] > rotateArray[right]:

                left = mid +1

            else:

                right = mid -1

        return 0


mid 表示用右移1位比除以2更高效,节约大约一半的运行时间


ps:今天的心情还算比较不错,手机免费换了个屏幕,在碎屏险的保修期内。5.17号来学校那天送去的,今天拿到贴了钢化膜,换了手机壳,感觉又跟换了个新手机一样。说说最近的减肥心得吧,米饭该少吃还是要少吃,毕竟全是碳水化合物,哈哈哈哈。今天中午没有吃白米饭,吃完是觉得没有饱,睡觉的时候还觉得有点意犹未尽。但是两点钟 午睡结 束的时候,身体已经没有任何的感觉了,还觉得十分舒服。昨天说的8+16减肥法也可以试一哈,感觉自己像是一个 to c 的产品,每天都在不断的迭代。这次来学校,很多人都说我瘦了,穿以前的衣服确实也能感觉的出来。所以更加有动力去保持。前一周每天十点离开实验室,回去运动半个小时,然后洗澡睡觉,昨天晚上吃多了,停了一天。今天在想中午回去有大段的时间可以尝试运动完了再吃中饭。
        之前觉得食堂的菜油腻了,不给自己找借口,要找方法。就用开水泡几遍。对吃的食物做个测评:两荤一素(多了),一荤两素,不加米饭(可),一荤一素,不加米饭(少了),吃点其他代餐如燕麦,鸡胸肉。
        今天应该算是难得的好心情,要开心更要加油啊。
最近的规划觉得还不错,在学校的效率比在家也好很多,除了学习就是锻炼。之前觉得是在家的时间荒废了,其实也没有,休息是为了更好的学习和工作。自己也不是一无所获嘛。



以上是关于旋转数组中的元素查找的主要内容,如果未能解决你的问题,请参考以下文章

寻找旋转排序数组中的最小值 II(数组二分查找)打印1000以内的所有素数,并从键盘输入一个正整数,判断是否为素数数组元素统计(算法初阶基础知识)

二分查找来查找旋转数组

算法二分查找:旋转数组的最小数字

LeetCode-查找寻找旋转排序数组中的最小值 II

LeetCode: 153. 寻找旋转排序数组中的最小值(二分查找)

旋转数组中查找最小值-剑指Offer11