题解 | #旋转排列之找出最矮的牛# java
旋转排列之找出最矮的牛
https://www.nowcoder.com/practice/ea91217beb83444aa324b86bfab4a952
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param heights int整型一维数组 * @return int整型 */ public int findMin (int[] heights) { // write code here int left = 0; int right = heights.length - 1; int mid; while (left < right) { mid = (left + right) / 2; if (heights[left] < heights[right] && heights[mid] < heights[left]) { left = mid; } else if (heights[left] < heights[right] && heights[mid] > heights[right]) { right = mid; } else { left = mid; break; } } return heights[left]; } }
使用的是Java语言。
该题考察的知识点是二分查找算法(Binary Search Algorithm)在旋转排序数组中找到最小值。
代码的文字解释如下:
- 在findMin()方法中,我们使用int类型的参数heights表示整型数组。
- 创建两个变量 left 和 right,分别表示数组的左边界和右边界。初始时,left为0,right为heights数组的长度减1。
- 使用循环进行二分查找,循环条件是 left < right。在每次循环中,计算中间位置 mid,将其设为左右边界的中间值。
- 判断以下三种情况:如果 heights[left] < heights[right] 且 heights[mid] < heights[left],说明最小值一定在左半边,将 left 更新为 mid。如果 heights[left] < heights[right] 且 heights[mid] > heights[right],说明最小值一定在右半边,将 right 更新为 mid。其他情况下,即 heights[left] >= heights[right],说明最小值在左右半边都可能存在,我们将 left 更新为 mid 并退出循环。
- 循环结束后,返回 heights[left] 作为最小值。