*剑指Offer题目8:旋转数组的最小数字(Java)

面试题8:把一个数组最开始的若干个元素搬到数组的末尾,咱们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的全部元素都大于0,若数组大小为0,请返回0。面试

牛客网 OJ:旋转数组的最小数字算法

解题思路

1. brute force

for 循环遍历,效率低,时间复杂度是 O(n)

2. 二分法

旋转以后的数组分为两个子数组,前main的数组大于等于后面子数组的元素。

并且,最小的元素恰好是两个子数组的分界线。

所以能够用二分查找,时间复杂度降为 O(log n)。
复制代码

代码实现

1、for 循环遍历(brute force)数组

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array == null || array.length == 0) {
            return 0;
        }
        for(int i = 0; i<= array.length; i++) {
            if(array[i] > array[i+1]){
                return array[i + 1];
            } 
        }
        return array[0];
    }
}
复制代码

2、二分法查找bash

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array == null || array.length == 0) {
            return 0;
        } 
        int low = 0, high = array.length - 1;
        while(low < high) {
            int mid = low + (high - low) / 2;
            if(array[mid] > array[high]) { //说明分界线最小值在 mid 下标以后
                low = mid + 1;
            } else if(array[mid] < array[high]) { //说明分界线最小值在 mid 下标以前
                high = mid;//注意,这里有可能刚恰好和 mid 重合
            } else {
                high --;//如[2,2,1,2] 此时m=1, a[m] = 2 == a[h], h--, 末端下标往前移动一位
            }
        }
        return array[low];
    }
    
}
复制代码

总结

要求:重点掌握二分查找、归并排序和快速排序,作到可以随时正确、完整地写出它们的代码。数据结构

查找和排序

查找相对而言比较简单,不外乎顺序查找、二分查找、哈希表查找和二叉树查找。ui

要求:信手拈来写出完整的二分查找代码,这是对面试官起码的尊重。spa

若是面试题要求在排序的数组中查找一个数字,或者统计某个数字出现的次数,咱们均可以尝试用二分查找算法。code

哈希表 和 二叉排序树查找的重点在于考察对应的数据结构,而不是算法。排序

哈希表的优势:在 O(1) 时间内查找到某一元素,是效率最高的查找方式。get

排序比查找复杂。

要求:比较插入排序、冒泡排序、归并排序、快速排序等不一样算法的优劣。

必定要对各类排序算法的特色烂熟于心,须要掌握如下几点:

额外空间消耗、平均时间复杂度和最差时间复杂度等方面去比较这些排序算法的优缺点。

其中,快排是最常常面到的。

相关文章
相关标签/搜索