//接上上一篇博客,继续这个题目,现在数组中会有重复元素,情况将会变得十分复杂,比如说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. 枚举 switch case 标签必须为枚举常量的非限定名称

    枚举 switch case 标签必须为枚举常量的非限定名称 错误描述: Error:(63, 24) 错误: 枚举 switch case 标签必须为枚举常量的非限定名称. 解决思路: switch ...

  2. D. Equalize the Remainders 解析(思維)

    Codeforce 999 D. Equalize the Remainders 解析(思維) 今天我們來看看CF999D 題目連結 題目 略,請直接看原題 前言 感覺要搞個類似\(stack\)的東 ...

  3. django 连接 mysql数据库

    1.安装mysqlclient pip install mysqlclient 或 pycharm --> File --> settings --> Project: (项目名称) ...

  4. STM32移植FreeRTOS(1)

    "STM32F103VET6<_>FreeRTOS" 1.项目功能实现 1)LED灯定时闪烁 2)KEY按键检测 3)FreeRTOS任务创建 4)串口输出程序运行状态 ...

  5. P1948 [USACO08JAN]Telephone Lines S

    题意描述 在无向图中求一条从 \(1\) 到 \(N\) 的路径,使得路径上第 \(K+1\) 大的边权最小. 等等,最大的最小...如此熟悉的字眼,难道是 二分答案. 下面进入正题. 算法分析 没错 ...

  6. GDB调试基础使用方法

    尽管目前使用的VS code可以使用插件一键构建和运行程序,但GDB作为调试利器,还是值得花时间去学习的. 概述 GDB(GNU Debugger) 是一个由GNU开源组织发布的.UNIX/LINUX ...

  7. 【QT】QThread源码浅析

    本章会挑出QThread源码中部分重点代码来说明QThread启动到结束的过程是怎么调度的.其次因为到了Qt4.4版本,Qt的多线程就有所变化,所以本章会以Qt4.0.1和Qt5.6.2版本的源码来进 ...

  8. 排序算法—快速排序(Quick Sort)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  9. SQL2005中清空操作日志的语句(SQL2008有所不同)

    方法一(我常用的): backup transaction 库名 with no_log go DBCC SHRINKDATABASE(库名) go 在VS中调用语句: string sb = &qu ...

  10. Docker系列01—Docker 基础入门

    一.初识Docker和容器 1.1 什么是docker 容纳其他物品的工具,可以部分或完全封闭,被用于容纳.存储.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. 容器? 容器就是在隔离的环 ...