“`java
class Solution {
public int stockManagement(int[] stock) {
int l = 0;
int r = stock.length – 1;
//最右边的值肯定小于等于最左边的值,否则直接返回最左
if (stock[l] < stock[r]) {
return stock[l];
}
while (l < r) {
int mid = l + (r - l)/2;
if (stock[mid] > stock[r]) {
//说明mid在左半区间
l = mid + 1;
} else if (stock[mid] < stock[r]) {
//说明mid位于右半区间
r = mid;
} else {
//mid和r相等,说明有重复元素,无法确定mid位于哪个区间,所以需要遍历
r--;
}
}
return stock[r];
“`java
按照一个图解的思路来的,结果和帅地的思路一样
class Solution {
public int minArray(int[] numbers){
int l=0;
int r=numbers.length-1;
while (lnumbers[l]){
l=m+1;
}else if(numbers[m]}
class Solution:
def minArray(self, numbers: List[int]) -> int:
left = 0
right = len(numbers) - 1
while left < right:
mid = (right - left) // 2 + left
if numbers[mid] > numbers[right]:
left = mid + 1
elif numbers[mid] < numbers[right]:
right = mid
else:
right = right - 1
return numbers[left]
//时间复杂度:O(logn) 空间复杂度:O(1)
class Solution {
public:
int minArray(vector& numbers) {
int i = 0, j = numbers.size() - 1;
while (i < j) {
int m = (i + j) / 2;
if (numbers[m] > numbers[j]) i = m + 1;
else if (numbers[m] < numbers[j]) j = m;
else j--;
}
return numbers[i];
}
};
public int minArray(int[] numbers) {
int l = 0, r = numbers.length-1;
while(l < r){
int mid = l + (r - l)/2;
if(numbers[mid] > numbers[r]){
l = mid +1;
}
else if(numbers[mid] < numbers[r]) r = mid;
else r--;
}
return numbers[l];
}
//思路:二分缩小范围
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length - 1;
while(left < right){
int mid = left + (right - left) / 2;
if(numbers[mid] > numbers[right]){
left = mid + 1;
}else if(numbers[mid] < numbers[right]){
right = mid;
}else{
//相等
int min = numbers[left];
for(int i = left + 1;i <= right;i++){
if(numbers[i] < min){
min = numbers[i];
}
}
return min;
}
}
return numbers[left];
}
class Solution {
public int minArray(int[] numbers) {
int l=0;
int r=numbers.length-1;
while(l<=r){
int mid=(l+r)/2;
if(numbers[mid]<numbers[r])
r = mid-1;
else if(numbers[mid]>numbers[r])
l = mid+1;
else
r--;
}
return numbers[l];
}
}
共以下 27 个回答
“`java
class Solution {
public int stockManagement(int[] stock) {
int l = 0;
int r = stock.length – 1;
//最右边的值肯定小于等于最左边的值,否则直接返回最左
if (stock[l] < stock[r]) { return stock[l]; } while (l < r) { int mid = l + (r - l)/2; if (stock[mid] > stock[r]) {
//说明mid在左半区间
l = mid + 1;
} else if (stock[mid] < stock[r]) { //说明mid位于右半区间 r = mid; } else { //mid和r相等,说明有重复元素,无法确定mid位于哪个区间,所以需要遍历 r--; } } return stock[r];
}
class Solution {
public int minArray(int[] numbers) {
int l = 0,r=numbers.length-1;
}
呜呜
“`javanumbers[l]){
按照一个图解的思路来的,结果和帅地的思路一样
class Solution {
public int minArray(int[] numbers){
int l=0;
int r=numbers.length-1;
while (l
l=m+1;
}else if(numbers[m]
}}
“`C++& nums) {
int findMin(vector
int left = 0;
int right = nums.size() – 1;
}
“`
不会,建议专门弄一次二分查找的模板,讲讲细节,什么时候while(left<right)什么时候等于,相等时该干什么,不相等时是移动到mid还是移动到mid+1or-1
遍历找出最小值
官解 二分查找
时间:平均,O(logn);最坏,O(logn)
空间:O(1)
【思路】大致思路是利用二分查找:如果mid<right,在左半数组继续寻找;mid>right,在右半数组继续寻找;两者相等则需要特殊处理。有非常多corner case需要考虑,比如3313/1131。
【复杂度】时间复杂度O(logn)最坏O(n),空间复杂度O(1)
最坏情况下数组元素全相等时时间复杂度为O(N), 一般为O(logN)
时间复杂度O(logn) 空间复杂度O(1)
O(logn)时间复杂度
边界很难处理……
思路:根据旋转数组的特性,最小值将数组分为两部分,以此分类讨论:比较numbers[mid]与numbers[high]的情况
时间复杂度:O(logn) 空间复杂度:O(1)
edge case放在loop里:【10,1, 10,10,10】
时间复杂度:O((log2N)
空间复杂度:O(1)
时间复杂度:O(logN) 极端情况O(N)
空间复杂度:O(1)
不断缩减区域寻找最小数字,假设寻找的数字下标为l,arr[l] arr[mid] 使l++ 砍掉左边
时间复杂度:O(logn)
空间复杂度:O(1)
时间复杂度:O(logn)
空间复杂度:O(1)
时间复杂度O(logn),空间复杂度O(1)
MYCpp实现:& numbers) {
class Solution {
public:
int minArray(vector
int left = 0;
int right = numbers.size() – 1;
while(left < right)
{
int mid = (left + right) / 2;
if(numbers[mid] > numbers[right])
{
left = mid + 1;
}
else if(numbers[mid] < numbers[right])
right = mid;
else
right–;
}
return numbers[right];
}
};
二分查找
c++实现,& numbers) {
int minArray(vector
int left = 0;
int right=numbers.size()-1;