0%

find-minimum-in-rotated-sorted-array-ii

题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。请找出其中最小的元素。

注意数组中可能存在重复的元素。

题解

(我好像做过……但是我又不会了)

把所有可能的情况都列一遍也是能解出来的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int findMin(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if(nums[left]<nums[right])return nums[left];
if(nums[left]==nums[right])right--;
//nums[left]>nums[right]
else if(nums[mid]<nums[left])
{
right=mid;
}
else if(nums[mid]>nums[left])
{
left=mid+1;
}
//nums[mid]==nums[left]
else if(nums[mid]>nums[right])
{
left=mid+1;
}
else{
left++;
}
}
return nums[left];
}

但是效率也太低了:

执行用时:20 ms, 在所有 C++ 提交中击败了6.72%的用户

内存消耗:12.1 MB, 在所有 C++ 提交中击败了55.20%的用户

如果直接遍历一遍:

1
2
3
4
5
6
int findMin(vector<int>& nums) {
int min=nums[0];
for(int i=1;i<nums.size();i++)
min=min<nums[i]?min:nums[i];
return min;
}

执行用时:8 ms, 在所有 C++ 提交中击败了93.60%的用户

内存消耗:12 MB, 在所有 C++ 提交中击败了92.74%的用户

暴力求解效率居然这么高??那还做个毛线。


还是要多学习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int findMin(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
while(left<right)
{
int mid=(left+right)/2;
if (nums[mid] > nums[right])
left = mid + 1;
else if(nums[mid] < nums[right])
right = mid;
else
right = right - 1 ;
}
return nums[left];
}

执行用时:4 ms, 在所有 C++ 提交中击败了99.66%的用户

内存消耗:12 MB, 在所有 C++ 提交中击败了92.74%的用户

唉,应该是和右端点做比较啊!