旋转数组中的最小值 8

基于二分法

? ?

index1为首,index2为尾,indexMid指向中间

? ?

Number[index1]大于等于Number[index2]的条件满足时

? ?

判断index2index1的差距是否等于1

? ?

如果相等,说明index2即为那个突变点,最小值,将index2赋给indexMid,最终返回Number[indexMid]

? ?

如果不等,就取indexMid=index1index2的中间值

? ?

如果index1index2indexMid相等的话,那么就需要在index1index2之间用顺序查找

? ?

如果不等,若index1指向的数小于indexMid指向的数,将index1更新为indexMid

? ?

indexMId指向的数小于index2指向的数,将index2更新为indexMid

? ?

顺序查找

? ?

相邻两个数比较,如果前一个数大于后一个数,那么后一个数就是最小值。如果不是,则往后找

? ?

package minNumberInRotatedArray8;

? ?

public class OriCode_MinInRotatedNumber {

public static void main(String[] args) {

//????????????????int[] numbers = { 3, 4, 5, 1, 2 };

//????????????????int[] numbers = { 1, 0, 1, 1, 1 };

int[] numbers={1,1,1,0,1};

int result = Min(numbers);

? ?

System.out.println(result);

? ?

}

? ?

static int Min(int[] numbers) {

int index1 = 0;

int index2 = numbers.length - 1;

int indexMid = index1;

while (numbers[index1] >= numbers[index2]) {

if (index2 - index1 == 1) {

indexMid = index2;

break;

}

indexMid = (index1 + index2) / 2;

if (numbers[index1] == numbers[index2]

&& numbers[index1] == numbers[indexMid]) {

return MinInOrder(numbers, index1, index2);

}

if (numbers[indexMid] >= numbers[index1]) {

index1 = indexMid;

} else if (numbers[indexMid] <= numbers[index2]) {

index2 = indexMid;

}

? ?

}

return numbers[indexMid];

? ?

};

? ?

static int MinInOrder(int[] numbers, int index1, int index2) {

int result = numbers[index1];

for (int i = index1 + 1; i < index2; i++) {

if (result > numbers[i]) {

result = numbers[i];

}

}

return result;

? ?

}

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。