LeetCode 81——搜索旋转排序数组 II
1. 题目

2. 解答
2.1. 方法一
基于 LeetCode 33——搜索旋转排序数组 中的方法二。
当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],为了找到正确的转折点,我们查看 [mid, right] 之间有没有不等于 nums[mid] 的值,若有,则继续向右查找;否则向左查找。
class Solution {
public:
    int Binary_Search(vector<int>& nums, int left, int right, int target)
    {
        int mid = 0;
        while(left <= right)
        {
            mid = left + (right - left) / 2;
            if (nums[mid] == target)
            {
                return mid;
            }
            else if(nums[mid] < target)
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
       return -1;
    }
    bool search(vector<int>& nums, int target) {
        if (nums.size() == 0) return 0; // 数组为空
        int left = 0;
        int right = nums.size() - 1;
        int mid = 0;
        while(left < right)
        {
            mid = left + (right - left) / 2;
            if (nums[mid] > nums[right])
            {
                left = mid + 1;
            }
            else if (nums[mid] < nums[right])
            {
                right = mid;
            }
            else // nums[mid] = nums[right]
            {
                int flag = 1;
                for (int i = mid; i < right; i++)
                {
                    int temp = nums[mid];
                    if (nums[i] != temp) // mid 到 right 之间有不等于 nums[mid] 的值,向右边查找
                    {
                        flag= 0;
                        left = mid + 1;
                        break;
                    }
                }
                if (flag)
                {
                    right = mid; // mid 到 right 之间没有小于 nums[mid] 的值,向左边查找
                }
            }
        }
        int a = Binary_Search(nums, 0, right-1, target);
        int b = Binary_Search(nums, right, nums.size() - 1, target);
        return a == -1 && b == -1 ? false : true;
    }
};
2.2. 方法二
基于 LeetCode 33——搜索旋转排序数组 中的方法三。
当 nums[mid] = nums[right] 时,比如 [1, 1, 2, 1, 1],[1, 1, 0, 1, 1],我们直接将右边界 right 减一,然后继续查找。
class Solution {
public:
    bool search(vector<int>& nums, int target) {
       int left = 0;
        int right = nums.size() - 1;
        int mid = 0;
        while(left <= right)
        {
            mid = left + (right - left) / 2;
            if (nums[mid] == target)
            {
                return true;
            }
            else if (nums[mid] < nums[right])  // nums[mid] 在右边升序的数据区间内
            {
                if (nums[mid] < target && target <= nums[right]) left = mid + 1;
                else    right = mid - 1;
            }
            else if (nums[mid] > nums[right]) // nums[mid] 在左边升序的数据区间内
            {
                if (nums[left] <= target && target < nums[mid]) right = mid - 1;
                else    left = mid + 1;
            }
            else // nums[mid] = nums[right]
            {
                right--;
            }
        }
        return false;
    }
};
获取更多精彩,请关注「seniusen」!

LeetCode 81——搜索旋转排序数组 II的更多相关文章
- Java实现 LeetCode 81 搜索旋转排序数组 II(二)
		81. 搜索旋转排序数组 II 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判 ... 
- LeetCode 81 - 搜索旋转排序数组 II - [二分+暴力]
		假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于数组中. ... 
- LeetCode 81 搜索旋转排序数组II
		题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于 ... 
- LeetCode 81. 搜索旋转排序数组 II(Search in Rotated Sorted Array II)
		题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ... 
- Leetcode 81. 搜索旋转排序数组 II
		题目链接 https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/description/ 题目描述 假设按照升序排序的数 ... 
- [LeetCode每日一题]81. 搜索旋转排序数组 II
		[LeetCode每日一题]81. 搜索旋转排序数组 II 问题 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 & ... 
- 【LeetCode】81. 搜索旋转排序数组 II
		81. 搜索旋转排序数组 II 知识点:数组,二分查找: 题目描述 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 ... 
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
		33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ... 
- 81. 搜索旋转排序数组 II
		题目 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋 ... 
随机推荐
- Java8函数之旅 (六) -- 使用lambda实现Java的尾递归
			前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类 ... 
- Linux 下的多线程编程(1)
			#include<stdio.h> #include<pthread.h> #include<string.h> #include<sys/time.h> ... 
- Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
			转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ... 
- Oracle闪回恢复误删除的表、存储过程、包、函数...
			在日常的数据库开发过程汇总难免会出现一些误删除的动作, 对于一些误删的操作我们可以通过oracle提供的闪回机制恢复误删数据, 从而避免出现较大的生产事故. 下面是本人平时工作中积累的一些常用的操作, ... 
- 没有美工一样可以获取设计各种各样的UI图
			没有美工一样可以获取设计各种各样的UI图 http://www.iconfont.cn 
- mac 开启mysql日志
			step1: 进入终端进入mysql: step2 : 开启mysql日志 step3 : 查看mysql的日志文件所在位置 step4 : 在终端中用tail -f 命令打开该日志文件: 
- LeetCode 中级 - 翻转矩阵后的得分(861)
			有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后,将该矩阵的每一 ... 
- winform Treeview控件使用
			做角色菜单权限时用到treeview控件做树状显示菜单,简单总结了一下用法: 1.在winform窗体中拖入treeview控件,注意修改属性CheckBoxes属性为true,即在节点旁显示复选框 ... 
- Java源码解析——集合框架(一)——ArrayList
			ArrayList源码分析 ArrayList就是动态数组,是Array的复杂版本,它提供了动态的增加和减少元素.灵活的设置数组的大小. 一.类声明 public class ArrayList< ... 
- Python面向对象的类的操作
			import randomimport time class ElectronicCoupon(): def __init__(self): self.__ecid=time.strftime('%Y ... 
