class Solution {
public int stockManagement(int[] stock) {
int l = 0 , r = stock.length - 1;
while (l < r) {
int m = (r - l) / 2 + l;
if (stock[m] > stock[r]) {
l = m + 1;
} else if (stock[m] < stock[r]) {
r = m;
} else {
r--;
}
}
return stock[l];
}
}
class Solution {
public int stockManagement(int[] stock) {
int l = 0;
int r = stock.length - 1;
while (l<r) {
int mid = (l+r)/2;
if(stock[mid] > stock[r]){
l = mid + 1;
} else if(stock[mid] < stock[r]){
r = mid;
} else {
r--;
}
}
return stock[l];
}
}
class Solution {
public:
int stockManagement(vector& stock) {
int n = stock.size();
int l = 0, r = n – 1;
while(l < r){
int mid = (l + r) / 2;
if (stock[r] < stock[mid]){
l = mid + 1;
}else if(stock[r] > stock[mid]){
r = mid;
}else{
r -= 1;
}
}
return stock[r];
}
};
时间复杂度O(logn)
暴力法,直接遍历数组
class Solution {
public int stockManagement(int[] stock) {
int min = Integer.MAX_VALUE;
for(int i=0;i<stock.length;i++){
min = min>stock[i]?stock[i]:min;
}
return min;
}
}
时间复杂度:O(n)
二分法,逐个缩减范围
class Solution {
public int stockManagement(int[] stock) {
int l = 0;
int r = stock.length-1;
while(l<r){
int mid = l+(r-l)/2;
if(stock[l]<stock[r]){//没有进行移动或者移动次数为数组长度整数倍
return stock[l];
}else{//移动了数组
if(stock[mid]>stock[l]){
l = mid+1;
}else if(stock[mid]<stock[r]){
r = mid;
}else{
l++;
}
}
}
return stock[l];
}
}
思路:数组可能移动次数为数组长度的整数倍,这时候相当于不移动数组,并且由于数组最开始时候是有序的,所以这种情况直接返回第一个元素即可;如果数组移动的次数不是的话,那数组就会分为两段,一段是值较大的部分,一段是值较小的部分,我们通过二分法每次获取mid的值,比较mid处数组值与left和right所在值的大小,从而缩小空间,如果stcok[left]<stock[mid],则说明最小值是在mid和right之间,如果stock[right]>stock[mid],说明最小值是在left和mid之间,否则就是mid和left处值相等或者mid和right处值相等,这时候没办法判断是在哪一部分,但是一定不是left所处的值,让left++,继续比较。
时间复杂度:O(lgn)
共以下 21 个回答
class Solution {
/**
* 寻找旋转排序数组中的最小值(数组中可能有重复元素)
*/
public int findMin(int[] nums) {
// 初始化左右边界
int left = 0, right = nums.length – 1;
}
“`C++
class Solution {& stock) {
public:
//mid大于右边界证明min在mid的右边
//mid小于右边界证明min在mid的左边
int stockManagement(vector
if(stock.empty() true)
{
return -1;
}
int left = 0;
int right = stock.size() – 1;
while(left < right)
{
int mid = (left + right)/2;
if(stock[mid] > stock[right])
{
left = mid + 1;
}
else if(stock[mid] < stock[right])
{
right = mid;
}
else
{
right–;
}
}
return stock[left];
}
};
“`
有序旋转数组,找出最小开始的值,用二分查找
时间复杂度:O(logn),最坏 O(N)
额外空间复杂度:O(1)
思路:二分通过比较中间值的大小来确定旋转点的位置
时间复杂度:O(logn),最坏 O(N)
额外空间复杂度:O(1)
还挺难的,没想出来
java
class Solution {
public int findMin(int[] nums) {
int low = 0;
int high = nums.length – 1;
while(low < high){
int pivot = low + (high – low) / 2;
if(nums[pivot] < nums[high]){
high = pivot;
}else{
low = pivot + 1;
}
}
return nums[low];
}
}
提交
public int stockManagement(int[] stock) {
int l=0,r=stock.length-1;
while(l<r){
int mid =(r-l)/2+l;
if(stock[mid]>stock[r]){
l=mid+1;
}
else if(stock[mid]<stock[r]){
r=mid;
}
else{
r=r-1;
}
}
return stock[l];
}
思路:二分通过比较中间值的大小来确定旋转点的位置
class Solution {& stock) {
public:
int stockManagement(vector
int low =0, high = stock.size()-1;
while(low <= high){
int mid = low + (high – low)/2;
if(stock[mid] < stock[high] ){
high = mid;
}else if(stock[mid] > stock[high]){
low = mid + 1;
}else{
high -=1;//忽略右边界处理
}
}
return stock[low];
}
};
时间复杂度O(logN)
实践复杂度O(logN),空间复杂度O(1)
思路:int begin = 0, end = stock.size()-1, mid;
s[begin] < s[end]: return s[begin]
s[begin] > s[end]:
mid > begin: begin = mid + 1;
mid < begin: end = mid;
mid begin: begin = mid + 1;
s[begin] s[end]:
mid > begin: begin = mid + 1;
mid < begin: end = mid;
mid begin: begin = begin + 1; (这种情况不能确定最小值在mid的左边还是右边)
“`c++& stock) {
class Solution {
public:
int stockManagement(vector
int begin = 0, end = stock.size()-1, mid;
while (begin < end-1) { if (stock[begin] < stock[end]) return stock[begin]; else { mid = begin + (end - begin)/2; if (stock[mid] > stock[begin]) begin = mid + 1;
else if (stock[mid] < stock[begin]) end = mid; else { if (stock[begin] > stock[end]) begin = mid + 1;
else begin++;
}
}
}
return min(stock[begin], stock[end]);
}
};
“`
挺抽象的
https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/2694041/xun-zhao-xuan-zhuan-pai-xu-shu-zu-zhong-kaf1n
class Solution {& stock) {
public:
int stockManagement(vector
int n = stock.size();
int l = 0, r = n – 1;
while(l < r){
int mid = (l + r) / 2;
if (stock[r] < stock[mid]){
l = mid + 1;
}else if(stock[r] > stock[mid]){
r = mid;
}else{
r -= 1;
}
}
return stock[r];
}
};
时间复杂度O(logn)
class Solution {
public int stockManagement(int[] stock) {
int begin = 0;
int end = stock.length – 1;
while(begin < end){
int mid = (begin + end) / 2;
if(stock[mid] < stock[end]){
end = mid;
}
else if(stock[mid] > stock[end]){
begin = mid + 1;
}
else
end–;
}
return stock[begin];
}
}
//二分查找,以上为看答案后方法 空间O1 时间Ologn
//以下为原方法,也是二分查找,实现的复杂一些 空间Ologn 时间Ologn
class Solution {
public int stockManagement(int[] stock) {
return halfSearch(stock,0,stock.length-1);
}
}
时间复杂度:O(logn)
额外空间复杂度:O(1)
class Solution {& stock) {
public:
int stockManagement(vector
int left = 0;
int right= stock.size() -1;
while(left < right){
if(stock[left] < stock [right])
{
return stock[left];
}
int mid = (right +left)/2;
if(stock[mid] > stock[left]){
left = mid + 1;
}
else if(stock[mid] < stock[left]){
right = mid;
}
else{
left++;
}
}
return stock[left];
}
};
时间复杂度O(logN)空间复杂度O(1)