算法系列——Find Minimum in Rotated Sorted Array

xiaoxiao2021-02-28  92

算法描述

Suppose an array sorted in ascending order 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 array.

题目含义:题中定义了一种新的排序数组形式,旋转数组,即把一个数组最开始的若干个元素搬到数组的末尾。例如:{0,1,2,4,5,6,7} 的一个旋转数组为{4,5,6,7,0,1,2},要求找到其中最小的一个元素。

解题思路:显示我们可以通过暴力解法来遍历找到这个最小值,时间复杂度为O(n),但是这样显然没有利用旋转数组的特点,并不是最优解法。在排序的数组中,我们可以利用二分查找法实现O(logn)的查找。

特别注意: 以下情况:

如果排序数组的前面的0个元素搬到后面,也是符合旋转数组的定义,因此要特别注意这种情况;

如果 首尾元素和中间元素值相同,这种情况下并不能确定最小值在哪个区间,所以需要顺序查找法特殊处理。

以下为Java 语言实现的算法。

public class Solution { public int findMin(int[] nums) { if(nums==null) throw new IllegalArgumentException("Invalid parameter"); int index1=0; int index2=nums.length-1; int indexMid=index1; while(nums[index1]>=nums[index2]){ if(index2-index1==1){ indexMid=index2; break; } indexMid=(index1+index2)/2; if(nums[index1]==nums[index2]&&nums[index1]==nums[indexMid]) return minOrder(nums,index1,index2); if(nums[indexMid]>=nums[index1]) index1=indexMid; else if(nums[indexMid]<=nums[index2]) index2=indexMid; } return nums[indexMid]; } private int minOrder(int[] nums,int index1,int index2){ int result=nums[index1]; for(int i=index1+1;i<=index2;i++){ if(result>nums[i]) result=nums[i]; } return result; } }
转载请注明原文地址: https://www.6miu.com/read-64322.html

最新回复(0)