Suppose a sorted array 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.

【题目分析】

一个有序的数组经过一个旋转操作,求出旋转后数组中的最小值。

【思路】

一个有序的数组经过旋转之后会发生什么呢,数据被切割成两段,然后后半段移动到了前半段,此时前半段和后半段都是一个增序序列,而且前半段中的任意一个数都比后半段中的数大。如下:

1. 遍历法

这个算法很简单,只要从前往后遍历,如果是递增的那么就继续向后,如果出现了一个断点,即在某一个位置元素比前一个元素小,那么我们就返回断点数据。这就是整个数组中最小的那个元素。如果断点靠前的话我们很快就能找到这个元素,如果断点靠后的话则需要遍历整个数组。因此我们可以设置两个指针,同时向后和向前遍历,距离断点较近的指针会率先找到最小元素。

2. 二分查找

我们可以采用二分查找来找到最小值,二分查找的时间效率更高。如何实现呢?在有序数组的二分查找算法中,我们的问题是找到我们给定的一个数值,但是在这个问题题中,我们要找到在数组中最小的那个值。我们知道旋转后数组被分成两部分,这两部分中间存在一个断点,找到了断点也就找到了最小值。当我们求中间值时,中间值可能落在断点前面或者断点后面。如果落在断点前面,那么中间值肯定比最左边的值要大,因为前半段数组中值还是递增的。如果落在的断点之后,那么中间值要比最左边的值小,因为前半段任意一个数都比后半段的要大。因此我们可以通过最左边值与中间值的大小关系来改变我们要查找的范围。如下例子:


【java代码1】

 public class Solution {
public int findMin(int[] nums) {
int len = nums.length;
if(nums[0] < nums[len-1]) return nums[0];
int i = 0, j = len - 1; while(i < j){
if(nums[i] > nums[i+1]) return nums[i+1];
if(nums[j] < nums[j-1]) return nums[j];
i++; j--;
}
return nums[i];
}
}

【java代码2】

 public class Solution {
public int findMin(int[] nums) {
int len = nums.length;
if(nums[0] < nums[len-1]) return nums[0];
int left = 0, right = len - 1; while(left < right){
int mid = left + (right - left)/2;
if(left == right - 1) return Math.min(nums[left], nums[right]);
if(nums[left] < nums[mid]) left = mid;
else right = mid;
}
return nums[left];
}
}

LeetCode OJ 153. Find Minimum in Rotated Sorted Array的更多相关文章

  1. 【LeetCode】153. Find Minimum in Rotated Sorted Array 解题报告(Python)

    [LeetCode]153. Find Minimum in Rotated Sorted Array 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode. ...

  2. LeetCode OJ 154. Find Minimum in Rotated Sorted Array II

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  3. 【LeetCode】153. Find Minimum in Rotated Sorted Array (3 solutions)

    Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you ...

  4. 【刷题-LeetCode】153 Find Minimum in Rotated Sorted Array

    Find Minimum in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some p ...

  5. 【leetcode】153. Find Minimum in Rotated Sorted Array

    Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example ...

  6. leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search

    这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...

  7. 153. Find Minimum in Rotated Sorted Array - LeetCode

    Question 153. Find Minimum in Rotated Sorted Array Solution 题目大意:给一个按增序排列的数组,其中有一段错位了[1,2,3,4,5,6]变成 ...

  8. LeetCode 新题: Find Minimum in Rotated Sorted Array 解题报告-二分法模板解法

    Find Minimum in Rotated Sorted Array Question Solution Suppose a sorted array is rotated at some piv ...

  9. 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)

    [LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...

随机推荐

  1. 多表查询 INNER JOIN ON WHERE

    SELECT *FROM STUDENT_INFO siINNER JOIN CLASS_INFO ci on si.CLASS_INFO_ID = ci.ID INNER JOIN TEACHER_ ...

  2. 【ARM】S5PV210芯片的启动流程

    S5PV210芯片的设计者的思想 (1)芯片启动后执行iRom(BL0)的内容,进行时钟和看门狗等外设的初始化,将BL1和BL2拷贝到片内SRAM; (2)跳转到片内SRAM执行,完成外部SDRAM的 ...

  3. CodeForces 689E Mike and Geometry Problem

    离散化,树状数组,组合数学. 这题的大致思路和$HDU$ $5700$一样.都是求区间交的问题.可以用树状数组维护一下. 这题的话只要计算每一个$i$被统计了几次,假设第$i$点被统计了$ans[i] ...

  4. JavaScript忍者秘籍——运行时代码求值

    1. 代码求值机制 JavaScript中,有很多不同的代码求值机制. ● eval()函数 ● 函数构造器 ● 定时器 ● <script>元素 - 用eval()方法进行求值 作为定义 ...

  5. <poj - 3268> Silver Cow Party 牛のpart 最短路径问题

    本题链接 : http://poj.org/problem?id=3268 题目大意:牛们要去聚会,输入N = 顶点数(牛场):M = 边(路)的数目: X = 终点 (聚会点).问题:求来回时间的最 ...

  6. AngularJS 初学笔记(理论基础)

    AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库. AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一 ...

  7. shell的入门

    shell :弱类型. 解释型语言 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 ...

  8. CADisplayLink使用中的循环引用问题的解决

    解决循环引用的问题,参考学习了ibireme大神的YYFPSLabel的实现,整理以备用 // 如果直接用 self 或者 weakSelf,都不能解决循环引用问题 _link = [CADispla ...

  9. Windows漏洞利用与防护(2015.8)

    Windows平台下的漏洞利用与防护 0x00 概述 在过去的二十几年,Windows作为网络安全的主战场之一,攻于防的较量从未停息过.内存破坏漏洞作为研究的重点之一,经历了很多的发展也沉淀了前辈们许 ...

  10. 安装mysql的遇到的问题

    源:安装用的是mysql官网的binary包. 之前装mysql都是直接放到/usr/local,就想试试放到其他地方,然后..就悲剧了. 安装步骤没啥说的,官网上有.因为放置的位置不一样所以有些执行 ...