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比前面一个位置元素小,如果比第一个元素小,则此位置元素最小,否则就是第一个位置
- 如果相等,说明找到了 target 的一个位置,然后向左右两边扩展,找到 target 的起始位置和结束位置,返回 [start, end]。如果小于 target,说明 target 在 mid 的右边,更新 left = mid + 1。如果大于 target,说明 target 在 mid 的左边,更新 right = mid - 1。
- 重复步骤 2 和 3,直到 left > right,说明没有找到 target,返回 [-1, -1]。