直接返回最小值:
C++ STL
C++中Vector求最大值最小值
vector<int> v:
int max = *max_element(v.begin(),v.end()); // 最大值:
int min = *min_element(v.begin(),v.end()); // 最小值:
class Solution {
public:
int minArray(vector<int>& numbers) {
vector<int> rec;
int m = *min_element(numbers.begin(), numbers.end()); // vector 最小值
return m;
}
};
python
class Solution:
def minArray(self, numbers: List[int]) -> int:
return min(numbers)
二分查找:
输入一个递增排序的数组的一个旋转,说明旋转前序列最小值(第一个),旋转后在序列中间(分界点),
旋转后是两个递增序列,找到中间的分界点就可以
分界点:第二个递增序列的起始点
c++
class Solution {
public:
int minArray(vector<int>& numbers) {
int left = 0 , right = numbers.size()-1;
while(left < right){
//int mid = (left + right) / 2; // (high + low) 在两者较大时会发生整型越界,溢出
int mid = left + (right - left) / 2;
// 分界点:第二个序列的起始点
// 中间大于右边,说明中间在递增序列1,右边在递增序列2, 分界点在中间右边,区间左端调整
if(numbers[mid] > numbers[right]){
left = mid + 1;
}
// 中间小于右边,说明中间和右边在一个递增序列,分界点在中间左边,或者就是中间
// 所以不能 right = mid - 1, 要 right = mid
else if(numbers[mid] < numbers[right]){
right = mid;
}
// numbers[mid] == numbers[right] 数组有重复数字,两个序列可能又一个全为'2',eg 22212 22222
// 无法判断mid左边还是右边,哪个是全'x'序列, 执行 right = right - 1 缩小判断范围。
else{
right--;
}
}
return numbers[left]; // left == right 时跳出二分循环,返回分界点
}
};
python
class Solution:
def minArray(self, numbers: List[int]) -> int:
l = 0
r = len(numbers)-1
while l<r:
mid = l + (r - l) // 2 #
if numbers[mid] > numbers[r]:
l = mid + 1
elif numbers[mid] < numbers[r]:
r = mid
else:
r -= 1
return numbers[l]