//接上上一篇博客,继续这个题目,现在数组中会有重复元素,情况将会变得十分复杂,比如说1,1,1,1,1   或者1,1,3,1再来 3,3,3,1,1,1,3,这些都是可以的,都是符合题目要求的,如果有疑问,自己想想。那么这么复杂怎么找最大点呢?我找不到,我去看了我牛客网当时的思路,当时找的是最小值,我觉得没问题,我就这么找了。

下面给出代码:

class Solution {
public boolean search(int[] nums, int target) {
if(nums==null||nums.length==0)
return false;
if(nums.length==1)
return target==nums[0]?true:false;
int l=0;
int r=nums.length-1;
int i=find(nums,l,r);
while(i-1>=0&&nums[i-1]==nums[i])
i--; if(binarySearch(nums,l,i-1,target)!=-1||binarySearch(nums,i,r,target)!=-1)
return true;
else
return false; }
public int binarySearch(int[] nums,int l,int r,int target)
{
while(l<=r)
{
int mid=l+(r-l)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
r=mid-1;
else
l=mid+1;
}
return -1;
}
public int find(int[] nums,int l,int r)
{
while(l<=r)
{
if(nums[l]<nums[r])
return l;
int mid=l+(r-l)/2;
if(nums[mid]>nums[l])
l=mid+1;
else if(nums[mid]<nums[r])
r=mid;
else
l++;
}
return r;
}
}

将核心代码拿出来

public int find(int[] nums,int l,int r)
{
while(l<=r)
{
if(nums[l]<nums[r])
return l;
int mid=l+(r-l)/2;
if(nums[mid]>nums[l])
l=mid+1;
else if(nums[mid]<nums[r])
r=mid;
else
l++;
}
return r;
}
对于nums[l]<nums[r],因为现在有重复元素,所以不能加等号,比如说2,2,1,2,不能直接判断了,然后还是求出mid,因为现在我们找最小值了,所以我们右边的就不要动,这里的动指的是+1或者不加
1,直接等于mid,移动l=mid+1,不会错过最小值,可能会错过最大值。如果num[mid]>nums[l],说明现在mid左边是上升的,直接让l=mid+1,如果nums[mid]<nums[r],说明右边是上升的,所以我们
直接r=mid;如果都不满足,进入最后一个else,说明现在遇到了相等值,现在就不能用二分去判断了,只能慢慢的移动一个个来,让l++,这样的话,我们r不会移动,所以不会导致我们错过最小值,直到l移动
过了r,结束循环,返回我们的r,记住很关键的一点,这个r现在是我们找到的最右边的那个最小值,所以当你返回以后,还是需要处理的。
这种情况只有右边全是最小值的时候才会发生,3,1,1,1的时候是最后的一个1,但是如果是3,1,1,1,3返回的就是第一个1了,感觉很奇妙。现在下课了,那么就写到这吧。有什么问题,可以讨论。

leetcode 33和 leetcode81 II的更多相关文章

  1. leetcode 33和 leetcode81

    //感想: 1.对于这两题,我真的是做到吐,这篇博客本来是昨晚准备写的,但是对于这个第二题,我真的做到头痛,实在是太尼玛的吐血了,主要是我也是头铁,非要找到那个分界点. 2.其实之前在牛客网上做过非常 ...

  2. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  3. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

  4. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  5. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  6. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  7. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  8. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  9. leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II

    33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...

随机推荐

  1. 阿里云MNS官方PHP版SDK缺少message tag问题处理

    最近在使用阿里云MNS官方PHP版SDK的过程中,发现发送到topic的消息,不能设置tag(其它语言版本SDK支持tag,如java,python),但在阿里云控制台页面发送是可以设置tag的. 因 ...

  2. 彻底理解RSA加密算法

    RSA是非常典型的非对称加密算法 它的算法是这样的 加密是我们把明文M转化成密文C 需要用到加密运算 而解密时我们要用解密运算将密文C转化成M 从表达式中 可以看出 e和d使我们需要确定的参数 而N是 ...

  3. Pytest 系列(25)- 标记用例级别 @allure.

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 平时写测试用例也会划分优先级 ...

  4. 续 Eureka+Hystrix+Zuul(Zuul API网关)

    概述: 服务的合并,转发,验证,异构协议.将上百个请求融为一个发送到后台,返回大的JSON返回处理: 作用:这减少了客户端与应用程序间的交互次数,还简化了客户端代码. Zuul可以通过加载动态过滤机制 ...

  5. 没人比我更懂 HashMap :)

    哈,标题开个玩笑,0202 年的段子哈. 一.首先看一下 HashMap 的构造函数 /** * Constructs an empty <tt>HashMap</tt> wi ...

  6. JS--遍历对象属性的五种方式

    ES6 一共有 5 种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). (2)Object.keys(obj) Ob ...

  7. Prometheus监控告警浅析

    前言 最近有个新项目需要搞一套完整的监控告警系统,我们使用了开源监控告警系统Prometheus:其功能强大,可以很方便对其进行扩展,并且可以安装和使用简单:本文首先介绍Prometheus的整个监控 ...

  8. 自制 os 极简教程1:写一个操作系统有多难

    为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...

  9. 这么好?中科图新项目经理教你开发LocaSpace功能

    LocaSpace是专注于实景三维数据应用的三维数字地球软件,为开发者提供强大.稳定的SDK服务,花费很少的精力即可在自己产品中集成某项功能.   我们将于2018年7月18日至7月20日举办&quo ...

  10. 多级iframe中,获取元素相对于浏览器左上角的坐标(非当前frame)

    搜索了好多文章,都不是自己想要的,所以在此贴下自己的解决方案,做个笔记. 1.常规需求:获取当前元素距离左边.顶部的距离 1 var x = $(div).offset().left; 2 var y ...