领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
请找出其中最小的元素。
你可以假设数组中不存在重复元素。
示例 1:
输入: [3,4,5,1,2] 输出: 1
示例 2:
输入: [4,5,6,7,0,1,2] 输出: 0
这题拿到手发现很简单。。实际上也的确比较简单。我以为会挖个什么坑在等我,但是只要使用遍历数组的办法找到下一个值比上一个小的地方,输出后值就是答案。
这样做的时间复杂度是O(n)。在LeetCode的评测中,使用JAVA打败了62%的人,使用C打败了100%的人 XD
同时,我以为是题目设置问题,去度娘了一下,发现了还有二分的做法,使用二分做法也完成了,时间复杂度是O(logn),但是在这题的测试环境中反而比遍历的做法要慢。
附上两种做法代码:
1 class Solution { 2 public int findMin(int[] nums) { 3 int ans=0; 4 for (int i=0;i<nums.length;i++) 5 { 6 if(nums[i+1]<nums[i]) 7 ans = nums[i+1]; 8 } 9 return ans; 10 } 11 }
1 class Solution { 2 public int findMin(int[] nums) { 3 int low=0; 4 int high=nums.length-1; 5 int mid; 6 while(low<high) 7 { 8 mid=(low+high)/2; 9 if(nums[mid]>nums[high]) 10 low=mid+1; 11 else if(nums[mid]<nums[high]) 12 high=mid; 13 } 14 return nums[low]; 15 } 16 }