import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param heights int整型一维数组
     * @return int整型
     */
    public static int findMin (int[] heights) {
        // write code here
        int start = 0;
        int end = heights.length - 1;
        while (start <= end) {
            int mid = (start + end) / 2;
            if (mid==0 && heights[mid]<heights[mid+1]) {
                return heights[0];
            } else if (mid == heights.length-1 && (heights[mid]<heights[mid-1])){
                if(heights[mid]<heights[0]) {
                    return heights[heights.length-1];
                }else{
                    return heights[0];
                }
            } else if(heights[mid]<heights[mid-1] && heights[mid]<heights[mid+1]){
                return heights[mid];
            } else if(heights[mid-1]>heights[mid] && heights[mid]>heights[mid+1]){
                start = mid+1;
            } else if(heights[mid]>heights[mid+1] && heights[mid]>heights[mid-1]){
                end = mid-1;
            }
        }
        return heights[start];
    }

}

本题主要考察的是双指针,所用编程语言是java.解题步骤如下:

定义两个变量 left 和 right,分别表示数组的左边界和右边界,初始值为 0 和 n-1,其中 n 是数组的长度。

计算中间位置 mid = (left + right) / 2,向下取整。

比较数组中的 mid 位置的元素和其余位置元素的关系

如果mid位置是数组最后一个位置,mid比前面一个位置元素小,如果比第一个元素小,则此位置元素最小,否则就是第一个位置。

如果mid位置是数组第一个位置,mid比后面一个位置元素小,则此位置元素最小。

如果mid位置是中间位置,如果mid位置比前面位置和后面位置元素都小,则此位置元素最小;

如果mid位置比前面位置元素小,比后面位置元素大 start=mid+1

如果mid位置比前面位置元素大,比后面位置元素大 end=mid-1