在有序旋转数组中找到最小值
题目
有序数组arr可能经过一次旋转处理,也可能没有,且arr可能存在重复的数。例如,有序数组[1,2,3,4,5,6,7],可以旋转处理成[4,5,6,7,1,2,3]等。给定一个可能旋转过的有序数组arr,返回arr中的最小值。
基本思路
尽可能的利用二分查找,但是最坏情况仍然无法避免O(N)的时间复杂度。首先需要知道,如果一个有序数组经过旋转后,最小的值一定是数组中降序的那个位置,其余部分都是升序。同时,数组的第一个元素一定比最后一个元素大。如果没有经过旋转,数组整体都是升序,最小值就是数组的第一个值。
所以在利用二分查找的时候,如果arr[left] < arr[right],说明数组整体升序,直接返回arr[left]。否则,如果arr[left] > arr[mid],说明降序一定发生在数组左半区,令right = mid;如果arr[mid] > arr[right],说明降序一定发生在数组右半区,令left = mid。
但是有一个很重要的问题,在arr数组中可能存在重复的值,那么就可能发生arr[left] == arr[mid] == arr[right]的情况。这个时候,我们从left位置开始,向右遍历,假设遍历到位置i,如果arr[i] == arr[mid],继续向右遍历;如果arr[i] > arr[mid],说明降序一定发生在arr[i…mid]之间,令left = i,right = mid;如果arr[i] < arr[mid],说明此时出现了降序,直接返回arr[i]即可。如果遍历到mid位置都一直与arr[mid]相等,说明左半区都是一个值,所以降序一定出现在右半区,所以令left = mid。
最坏的情况下,所有的值都是一个值。对于每个值都需要遍历一遍,所以最坏的时间复杂度是O(N)。
def getMin(arr):low = 0high = len(arr) - 1while low < high:if low == hight - 1:breakif arr[low] < arr[high]:return arr[low]mid = (low + high)//2if arr[mid] < arr[low]:high = midcontinueelif arr[mid] > arr[high]:low = midcontinuewhile low < mid:if arr[low] == arr[mid]:low +=1elif arr[low] < arr[mid]:return arr[low]else:high = midbreakreturn min(arr[left],arr[right])
在有序旋转数组中找到最小值相关推荐
- LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- 求旋转数组中的最小值
旋转数组的概念:把一个数组最开始的若干个元素搬到数组的末尾,我们称为数组的旋转.例如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 解法用到了二分查找法. 有一种特殊情 ...
- LeetCode 154 在有序旋转数组中找最小-2
Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? Woul ...
- Java算法之寻找旋转数组中的最小值
153 class Solution {public int findMin(int[] nums) {int i=0;int j=nums.length-1;while(i<j){if(num ...
- 算法-------寻找旋转排序数组中的最小值
题目 寻找旋转排序数组中的最小值假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ).请找出其中最小的元素 ...
- Leetcode 153. 寻找旋转排序数组中的最小值 解题思路及C++实现
解题思路:二分查找 使用二分查找来寻找最小值. left,right,mid分别代表数组中最左边.中间.最右边的元素.这三个数字在旋转数组中的大小比较总共有三种情况. 1.数组是升序的,即 nums[ ...
- python 寻找旋转排序数组中的最小值
| 寻找旋转排序数组中的最小值 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到 ...
- 153. 寻找旋转排序数组中的最小值 golang
153. 寻找旋转排序数组中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j ...
- LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)
154. 寻找旋转排序数组中的最小值 II 题意 给定一个包含重复元素的升序旋转数组 找出旋转数组的最小值 二分法 class Solution {public int findMin(int[] n ...
最新文章
- 科学前进的车轮永不停歇 2018-04-28
- Beaglebone Black USB联机
- leetcode115. 不同的子序列
- python类和对象介绍_Python开发基础-Day17面向对象编程介绍、类和对象
- ios 开发需要看的书籍
- Web系统测试Web安全性测试
- Vanguard集团在美上市ETF资产超8700亿美元
- VMware Cloud Director 10.4 发布 (含下载) - 云计算调配和管理平台
- mac环境下Android 反编译
- extension(扩展)使用详情
- sshd远程主机间的访问
- 南京银行之八,风险提示
- 10.24程序员节疑问:沈从文的编程功底应该很厉害吧?
- 佳能2420报错代码E000007-0000
- 高通QCA平台常见wifi命令使用
- 时间序列模型SCINet(代码解析)
- XigmaNas系统(一):常见NAS系统选择比较
- 35岁之后软件测试工程师靠什么养家?我还能继续做测试。
- c#日期格式操作(贴吧转)
- 表单数据序列化之serialize()、serializeArray()方法的使用