题解 | #旋转排列之找出最矮的牛#
旋转排列之找出最矮的牛
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];
}
};
查看6道真题和解析
