难度
思路
- 二分法
| 时间复杂度 | O(logn) | | —- | —- | | 空间复杂度 | O(1) |/*** 递增数组->截取一部分放置原数组后面。* 要点: 二分法判断。让中间数值与最右边比较,如果中间值较大,则表示最小值在右边,如果中间值较小,则表示最小值在左边。如果相等,则右值-1,继续二分法查找。*/public class No11_ArrayTheminNumber {public static void main(String[] args) {int[] data = {3,4,5,1};System.out.println(minArray_1(data));}public static int minArray_1(int[] numbers) {if (numbers.length == 0)return -1;if (numbers.length == 1)return numbers[0];int i =0, j = numbers.length - 1;while (j > i) {int mid = (i + j)/2; // 取小值if (numbers[mid] > numbers[j]) {// 在右边,+1不要忘记了i = mid + 1;} else if (numbers[mid] < numbers[j]) {// 在右边j = mid;} else {// 相等j--;}}return numbers[i];}}
总结
- 如何确定该往哪个方法走。需要判断中间值与最右边的值的大小。
- 在最坏的情况下,即数组中每个元素都相等,则时间复杂度会退化为 O(n)。
