class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1){
return nums[0];
}
int left = 0;
int right = nums.size()-1;
while(left < right){
int mid = left + (right - left)/2;
if(nums[mid] > nums[right]){
left = mid + 1;
}
else{
right = right -1;
}
}
return nums[left]>nums[right]? nums[right]:nums[left];
}
};
class Solution {
public int minArray(int[] numbers) {
int left=0;
int right=numbers.length-1;
while(left<right){
int mid = (right-left)/2+left;
if(numbers[left]<numbers[right]){
return numbers[left];
}
if(numbers[mid]>numbers[left]){
left = mid+1;
}else if(numbers[mid]<numbers[left]){
right = mid;
}else{
left++;
}
}
return numbers[left];
}
}
func minArray(numbers []int) int {
var l int = 0
var r int = len(numbers) - 1
for l < r {
mid := (r-l)/2 + l
if numbers[mid] > numbers[r] {
l = mid + 1
}else if numbers[mid] < numbers[r] {
r = mid
}else {
r-- // 当和右端点相等时,右端点有替代值
}
}
return numbers[l]
}
class Solution {
public int minArray(int[] numbers) {
int i = 0, j = numbers.length - 1;
while(i < j){
int m = i + (j - i) / 2;
if(numbers[m] > numbers[j]) i = m + 1;
else if(numbers[m] < numbers[j]) j = m;
else j -= 1;
}
return numbers[i];
}
}
class Solution {
public int minArray(int[] numbers) {
int l = 0, r = numbers.length - 1;
while(l <= r) {
int mid = l + r >> 1;
if(numbers[mid] > numbers[r]) l = mid + 1;
else if(numbers[mid] < numbers[r]) r = mid;
else r --;
}
return numbers[l];
}
}
共以下 21 个回答
class Solution {& numbers) {
public:
int minArray(vector
int len = numbers.size();
int left = 0;
int right = len – 1;
};//滴滴
“`c++代码& numbers) {
class Solution {
public:
int minArray(vector
return *min_element(numbers.begin(), numbers.end());
}
};
时间 O(logn)
空间 o(1)
c++ 没用二分查找 invec; & numbers)
class Solution {
vector
int tmax=9999;
public:
int minArray(vector
{
for(int t=0;t<2;t++)
{
for(int i=0;i<numbers.size();i++)
{
invec.push_back(numbers[i]);
if(tmax>numbers[i])
tmax=numbers[i];
};
”’java
class Solution {
public int minArray(int[] numbers) {
int l = 0;
int r = numbers.length – 1;
if(numbers[l] < numbers[r]){
return numbers[0];
}
while(l < r){
int mid = (l + r)/2;
if(numbers[mid] > numbers[r]){
l = mid + 1;
}else if(numbers[mid] < numbers[r]){
r = mid;
}else{
r–;
}
”’
时间复杂度O(logn)
空间复杂度O(1)
空间O(1)
时间O(logn)
时间复杂度:O(logn)
空间复杂度:O(1)
时间复杂度:最好情况:o(log(n)) 最差情况:o((n))
空间复杂度:o(1)
代码
class Solution {
public int minArray(int[] numbers) {
//从左到右 只能 递增 中间会有断点
//二分 找最小值 如果 right>=mid 那么 右边递增 最小在左
//如果 right<=mid 那么 最小在 mid 后面
int left =0;
int right = numbers.length -1 ;
int mid;
while(left<right)
{
mid=(left+right)/2;
if(numbers[mid]>numbers[right])//中间大于右边 一定在中间到右边
{
left = mid +1;
}else if(numbers[mid]<numbers[right]) //右边是递增
{
right =mid;
}else//2种 有可能是没变化 那么在左边 有可能是在中间 无法判断 让right–
{
right–;
}
}
第二次碰到还是没做出来
以下是代码:
难点还是想到是和右端点比较还有就是r–的操作
7.23
Day15:下面是代码
其实主要找的就是两段有序序列的边界,第二段序列的左边界就是我们要的答案。
采用左闭右闭的原则,r不能跳到mid – 1,而要跳到mid,原因是因为mid本身的元素可能就是最小值。