题解 | #旋转排列之找出最矮的牛#

旋转排列之找出最矮的牛

https://www.nowcoder.com/practice/ea91217beb83444aa324b86bfab4a952

考察的知识点:数组、二分查找;

解答方法分析:

  1. 判断数组的最右边的元素是否小于等于数组的最左边的元素。如果是,则直接返回最右边的元素,即数组中的最小值。
  2. 定义两个指针 left 和 right 分别指向数组的最左边和最右边。
  3. 进入循环,判断 left 是否小于 right,如果不满足条件,则结束循环。
  4. 在循环中,计算中间元素的索引 mid,采用向上取整的方式使得 mid 尽可能地靠右偏移。
  5. 如果 heights[mid] 小于 heights[right],则说明最小元素在 mid 或者 mid 的左边,更新 right 为 mid
  6. 如果 heights[mid] 大于 heights[right],则说明最小元素一定在 mid 的右边,更新 left 为 mid + 1
  7. 如果 heights[mid] 等于 heights[right],则无法确定最小元素在哪个半区,可以通过将 left 向右移动一位来缩小搜索范围。
  8. 循环结束后,返回 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];
    }
};

全部评论

相关推荐

可以不说话:笔试a了3道半,今天说是挂了😭😭
投递汇丰科技等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务