题解 | #旋转排列之找出最矮的牛#
旋转排列之找出最矮的牛
https://www.nowcoder.com/practice/ea91217beb83444aa324b86bfab4a952
考察的知识点:数组、二分查找;
解答方法分析:
- 判断数组的最右边的元素是否小于等于数组的最左边的元素。如果是,则直接返回最右边的元素,即数组中的最小值。
- 定义两个指针
left
和right
分别指向数组的最左边和最右边。 - 进入循环,判断
left
是否小于right
,如果不满足条件,则结束循环。 - 在循环中,计算中间元素的索引
mid
,采用向上取整的方式使得mid
尽可能地靠右偏移。 - 如果
heights[mid]
小于heights[right]
,则说明最小元素在mid
或者mid
的左边,更新right
为mid
。 - 如果
heights[mid]
大于heights[right]
,则说明最小元素一定在mid
的右边,更新left
为mid + 1
。 - 如果
heights[mid]
等于heights[right]
,则无法确定最小元素在哪个半区,可以通过将left
向右移动一位来缩小搜索范围。 - 循环结束后,返回
heights[left - 1]
,即找到的最小元素。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param heights int整型vector * @return int整型 */ int findMin(vector<int>& heights) { int left = 0, right = heights.size() - 1; if (heights[right] <= heights[left]) { return heights[right]; } while (left < right) { int mid = left + (right - left + 1) / 2; if (heights[mid] < heights[right]) { left = mid + 1; } else if (heights[mid] > heights[right]) { right = mid; } else { left += 1; } } return heights[left - 1]; } };