153. 寻找旋转排序数组中的最小值

  我不复制题目了,太丑。转跳戳这里:--\(˙<>˙)/--

  这道题最简单的做法就是一个个比较,从第一个比到最后一个,但是很显然这样子太暴力了,leetcode哪里会出这种题目给我们。注意题目的字眼 “假设按照升序排序的数组在预先未知的某个点上进行了旋转”,这很明显就是想让我们用二分查找写这道题目,可这种二分该怎么写呢 。

  可以将中间点与终点进行比较,会产生两种情况,两个结论

  • mid < right:最小值在左半部分
  • mid > right:最小值在右半部分

这两个结论说明,如果使用二分查找,就只需要将 mid 上的值与 right上的值进行比较,根据结果丢弃一半。

  • mid < right:left = mid+1
  • mid > right:right = left;

一直到left == right就可以返回了

  PS:之所以二分中间值更新变成了left = mid+1;而不是 left = (left  + (right-left)/ 2),是因为需要考虑到长度为2的数组。如果长度为2,还是原本的二分跟新方式那么mid=left,mid 依然大于 left。如此导致的结果就是程序陷入死循环,left无法得到更新。

下面是AC的代码:

 1 int findMin(int* nums, int numsSize){
 2     int low = 0, high = numsSize-1;
 3     while (low < high)
 4     {
 5         if (nums[low] < nums[high])
 6         {
 7             return nums[low];
 8         }
 9         int mid = low + (high - low) / 2;
10         if (nums[mid] > nums[high])
11         {
12             low = mid + 1;
13         }
14         else
15         {
16             high = mid;
17         }
18     }
19     return nums[low];
20 }

  算法不易,诸君共勉!

原文地址:https://www.cnblogs.com/daker-code/p/12232699.html

时间: 2024-10-12 21:54:23

153. 寻找旋转排序数组中的最小值的相关文章

LeetCode: 153. 寻找旋转排序数组中的最小值(二分查找)

假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重复元素. 示例 1: 输入: [3,4,5,1,2]输出: 1示例 2: 输入: [4,5,6,7,0,1,2]输出: 0 public int findMin(int[] nums) { int lo = 0, hi = nums.length - 1; while (lo < hi) { int

LeetCode 153. 寻找旋转排序数组中的最小值

假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重复元素. 示例 1: 输入: [3,4,5,1,2]输出: 1示例 2: 输入: [4,5,6,7,0,1,2]输出: 0 算法:直接二分即可(没想到吧,不是有序数组也能二分!).这是因为旋转后的数组每一段都是有序的. class Solution { public: int findMin(vec

lintcode:寻找旋转排序数组中的最小值 II

寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在重复的元素. 解题 暴力直接线性查找 或者,线性找到第一个开始降序的位置对应的数 应该考虑二分法 递归 + 二分 public class Solution { /** * @param num: a rotated sorted array * @return: the minimum number in

寻找旋转排序数组中的最小值

寻找旋转排序数组中的最小值 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 你可以假设数组中不存在重复的元素. 注意事项 You may assume no duplicate exists in the array. 样例 给出[4,5,6,7,0,1,2]  返回 0 标签 二分法 1 class Solution { 2 public: 3 /** 4 * @param nums: a rota

leetcode153. 寻找旋转排序数组中的最小值

假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重复元素. 示例 1: 输入: [3,4,5,1,2]输出: 1 示例 2: 输入: [4,5,6,7,0,1,2]输出: 0 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array

【面试题】寻找旋转排序数组中的最小值

题目描述 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2).你需要找到其中最小的元素.http://www.lintcode.com/zh-cn/problem/find-minimum-in-rotated-sorted-array/ 解题思路 基本思想采用二分查找,不过首先要判断这个排序数组是否直接有序,如果是0 1 2 3 4 5 6 7这样的数组,最小值就是第一个值:接着就采用二分法来查找 代码实现 class Soluti

领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解

假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重复元素. 示例 1: 输入: [3,4,5,1,2] 输出: 1 示例 2: 输入: [4,5,6,7,0,1,2] 输出: 0 这题拿到手发现很简单..实际上也的确比较简单.我以为会挖个什么坑在等我,但是只要使用遍历数组的办法找到下一个值比上一个小的地方,输出后值就是答案.这样做的时间复杂度是O(

[Swift]LeetCode153. 寻找旋转排序数组中的最小值 | Find Minimum in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]). Find the minimum element. You may assume no duplicate exists in the array. Example 1: Input: [3,4,5

154. 寻找旋转排序数组中的最小值 II

转跳点:--\(˙<>˙)/-- 原本打算大年三十十一起写完的,结果这篇拖到了年初一…… 这道题比刚刚那道,麻烦一点,因为有重复,所以我们需要考虑重复的情况,就是刚刚的两种情况变成了三种: mid < right:left = mid+1 mid > right:right = left; mid = right:left++: 为什么是++?题目说了升序,如果相等那么说明只有两种可能 整个数组都是一个数 旋转点极有可能就是这个数(貌似和解题无关) 所以无论如何那种情况,题设想要的