二分旋转数组

题目

https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/

解法

暴力解法, 0(n)不符合要求

有序,要到0(logn),考虑二分查找,排序数组的查找问题首先考虑使用 二分法 解决,其可将遍历法的 线性级别 时间复杂度降低至 对数级别

定下大概思路,

接着弄清楚算法流程:

  1. 入口,设置 i, j 指针分别指向 numbers 数组左右两端,m = (i + j) // 2为每次二分的中点
  2. 循环二分:

    1. 比较 number[m] > number[j]
    2. number[m] < number[j]
    3. 特殊 number[m] == number[j]

    是否可以用 numbers[m]numbers[i] 比较做代替?
    解析: 不可以。因为做比较的目的是判断 mm 在哪个排序数组中。但在 numbers[m] > numbers[i]情况下,无法判断 m 在哪个排序数组中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public int minArray(int[] numbers) {
if (numbers == null || numbers.length ==0) {
return Integer.MIN_VALUE;
}
int len = numbers.length;
int i=0, j = len-1;
while(i<j) {
int m = i + (j-i)/2;

// 错误示范!!!!, 以后写条件判断,if() else if(); 变量改变了条件。
if (numbers[m] > numbers[j]) {
i = m+1;
}
if (numbers[m] < numbers[j]) {
j = m;
}
if (numbers[m] == numbers[j]) {
j--;
}
// ------
if (numbers[m] > numbers[j]) {
i = m+1;
} else if(numbers[m] < numbers[j]) {
j = m;
} else {
j--;
}

}
return numbers[i];
}
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×