LintCode 160. Find Minimum in Rotated Sorted Array II (Medium)

LeetCode 154. Find Minimum in Rotated Sorted Array II (Hard)

解法1

自己做了半个小时, 想分情况判断num[mid]num[start], num[mid]num[end]的大小关系, 每个关系分>, =, <的情况, 于是就是9种情况...

>, >, L = M + 1
>, =, 选L
>, <, 选L
=, >, L = M + 1
=, =, 二分递归
=, <, 选L
<, >, 不可能
<, =, R = M
<, <, R = M

然后就是下面这蛋疼的代码...

class Solution {
private:
int rec(vector<int> &num, int start, int end) {
if (start == end) return num[start];
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (num[mid] > num[start]) {
if (num[mid] > num[end]) {
start = mid + 1;
} else {
return num[start];
}
} else if (num[mid] == num[start]) {
if (num[mid] > num[end]) {
start = mid + 1;
} else if (num[mid] == num[mid]) {
return min(rec(num, start, mid), rec(num, mid + 1, end));
} else {
return num[start];
}
} else {
end = mid;
}
}
return min(num[start], num[end]);
}
public:
int findMin(vector<int> &num) {
return rec(num, 0, num.size() - 1);
}
};

解法1.1

观察9种情况发现有些情况可以合并.

x, >, L = M + 1
<, x, R = M
x, =, --R
else 选L
class Solution {
public:
int findMin(vector<int> &num) {
if (num.empty()) return 0;
int start = 0, end = num.size() - 1;
while (start < end) {
int mid = start + (end - start) / 2;
if (num[mid] > num[end]) {
start = mid + 1;
} else if (num[mid] < num[start]) {
end = mid;
} else if (num[mid] == num[end]) {
--end;
} else {
return num[start];
}
}
return num[start];
}
};

解法2

参考这篇博文, 在Find Minimum in Rotated Sorted Array代码的基础上稍事修改就可以得到下面的代码. 当num[M] == num[R]时, 将R左移一位即可.

class Solution {
public:
int findMin(vector<int> &num) {
int n = num.size();
int L = 0, R = n - 1;
while (L < R && num[L] >= num[R]) {
int M = (R - L) / 2 + L;
if (num[M] > num[R]) {
L = M + 1;
} else if (num[M] < num[R]) {
R = M;
} else {
--R;
}
}
return num[L];
}
};

时间复杂度: O(logn) (在数组恒值的最差情况下退化到O(n))

空间复杂度: O(1)

[OJ] Find Minimum in Rotated Sorted Array II的更多相关文章

  1. 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 ...

  2. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)

    Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...

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

    Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...

  4. Leetcode之二分法专题-154. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II)

    Leetcode之二分法专题-154. 寻找旋转排序数组中的最小值 II(Find Minimum in Rotated Sorted Array II) 假设按照升序排序的数组在预先未知的某个点上进 ...

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

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

  6. 【刷题-LeetCode】154 Find Minimum in Rotated Sorted Array II

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

  7. 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 ...

  8. Java for LeetCode 154 Find Minimum in Rotated Sorted Array II

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  9. leetcode 【 Find Minimum in Rotated Sorted Array II 】python 实现

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

随机推荐

  1. 实现View弹性滑动例子

    弹性滑动原理 将一次大的滑动非为若干次小的滑动,并在一个时间段内完成.有一种顺畅的感觉更-好的用户体验 实现方式很多种,包括用Scroller.动画.延时策略. 使用Handler实现弹性滑动 效果可 ...

  2. [转]:移动端H5页面高清多屏适配方案

    原文链接:http://www.tuicool.com/articles/YJviea 背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们 ...

  3. Java实战之02Hibernate-01简介、常用接口、CRUD操作

    一.Hibernate简介 1.Hibernate在开发中所处的位置 2.ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 Object: Re ...

  4. mysql导入导出.sql文件 备份还原数据库

    从数据库导出数据库文件:   进入你的MySQL的安装目录的bin目录或者在C盘的根目录都行,我选的是在bin目录下,下面的例子出第一个外将以在C盘的根目录来讲解   我的mysql安装在了C盘,C: ...

  5. ubuntu 安装phpmyadmin

    参考文章: http://www.111cn.net/database/mysql/43957.htm    access错误的解决方法 1 首先下载  去官网下载phpmyadmin 2  然后直接 ...

  6. Linux下的visudo命令

    新建了一个test账号,su 后使用visudo命令,发现不可用,退出putty,直接用root登录,可以用了,小白了,visudo只能用root执行,简单写下visudo命令吧 visudo后得到的 ...

  7. react组件什么周期记录,转的

    react 的核心除了虚拟DOM,我想还有一个很重要的就是生命周期函数,理解生命周期函数,对写出合理的commponet很有帮助.下面总结一下我对生命周期函数的一些理解已经在项目过程中遇到的一些问题. ...

  8. tmux与vim主题不一致

    在centos6.5 x64 vim6.2 需要在tmux.conf中添加set -g default-terminal "screen-256color" 然后再次启动tmux的 ...

  9. Nigix快速上手注意事项

    linux下,主要关于配置,包括主从,待续......

  10. HTML块

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...