//感想:

1.对于这两题,我真的是做到吐,这篇博客本来是昨晚准备写的,但是对于这个第二题,我真的做到头痛,实在是太尼玛的吐血了,主要是我也是头铁,非要找到那个分界点。

2.其实之前在牛客网上做过非常类似的题目,当时就做的特别痛苦,后来做完也没总结,导致现在做又不知道思路了,不过好歹留下了代码,再次做的时候,看看之前的代码,再结合这道题目的要求也是做完了。

思路:对于33题。

题目要求要logn的,我们对自己要求也要严格一点,所有的都用二分来做,这题目其实是变种的二分,因为正常的二分是找寻一个target值,但是我们现在不是找一个target,而是去找这个排序数组的分界点,对于没有重复元素的,就比较容易了,

所以它只有这种类型,找分界点还是比较容易的。无论是找最大的,还是最小的,都是可以的,这里的二分法要格外注意左右两边的边界移动情况。这是找的最大值的下标,来看看这个helper函数

while(l<=r)
{
if(nums[l]<=nums[r])
return r;
int mid=l+(r-l)/2;
if(nums[mid]>nums[l])
l=mid;
else
r=mid-1;
}
return l;

首先如果nums[l]<=nums[r],那么这直接就是一条斜线,可以直接返回右边界,如果nums[mid]>nums[l],说明还在上升,移动左下标指向mid,记住
现在找的是最大值,所以不能让l=mid+1,而是等于mid,不然可能会错过最大值,else 直接让r=mid-1,因为不在上升就肯定在下边,所以直接等于
就行了,继续这样循环,直到右边界移出左边界,那时候我们返回l就行了。感觉还是可以的,主要是情况没有那么复杂,下面就是下一题,原本想做一篇
写的,但是感觉写的太臃肿了,还是在写一篇吧。

class Solution {
public int search(int[] nums, int target) {
if(nums==null||nums.length==0)
return -1;
if(nums.length==1)
return target==nums[0]?0:-1;
int l=0;
int r=nums.length-1;
int i=helper(nums,l,r); if(target>=nums[0])
return helper1(nums,l,i,target);
else
return helper1(nums,i+1,r,target);
}
public int helper1(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 helper(int[] nums,int l,int r)
{
while(l<=r)
{
if(nums[l]<=nums[r])
return r;
int mid=l+(r-l)/2;
if(nums[mid]>nums[l])
l=mid;
else
r=mid-1;
}
return l;
}
}

leetcode 33和 leetcode81的更多相关文章

  1. leetcode 33和 leetcode81 II

    //接上上一篇博客,继续这个题目,现在数组中会有重复元素,情况将会变得十分复杂,比如说1,1,1,1,1   或者1,1,3,1再来 3,3,3,1,1,1,3,这些都是可以的,都是符合题目要求的,如 ...

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

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

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

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

  4. [LeetCode] 33. Search in Rotated Sorted Array 在旋转有序数组中搜索

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  5. Java实现 LeetCode 33 搜索旋转排序数组

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

  6. LeetCode 33. Search in Rotated Sorted Array(在旋转有序序列中搜索)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  7. [LeetCode] 33. Search in Rotated Sorted Array_Medium tag: Binary Search

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  8. LeetCode 33 Search in Rotated Sorted Array(循环有序数组中进行查找操作)

    题目链接 :https://leetcode.com/problems/search-in-rotated-sorted-array/?tab=Description   Problem :当前的数组 ...

  9. 力扣Leetcode 33. 搜索旋转排序数组

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

随机推荐

  1. CTF-pwn:老板,来几道简单pwn

    wdb_2018_3rd_soEasy 保护全关 在栈上写入shellcode,然后ret2shellcode from pwn import * local = 0pa binary = " ...

  2. 利用云主机搭建MySQL服务器

    前言:有了一台云服务器之后,就想着如何物尽其用.利用其不关机(意外除外)的特性,我们可以在服务器上安装数据库服务,实现云数据库服务器,这样就可以随时随地的访问数据库了,不再受各种限制. 这里以MySQ ...

  3. requests 库和beautifulsoup库

    python 爬虫和解析 库的安装:pip install requests; pip install beautifulsoup4 requests 的几个常用方法: requests.reques ...

  4. python 数据分析之pandas

    pandas 是数据分析时必须用到的一个库,功能非常强大 其有两种数据结构:一维Series   二维表DataFrame(一般读取后的数据都是df) 导入:import pandas as pd 数 ...

  5. 专题五:redis的数据类型之set

    一.基本简介 现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率.虽然list满足存储大量的数据,也可以通过索引来进行访问,但是list底层是双向链表的结构,在查询上的效率并没 ...

  6. 如何做可靠的分布式锁,Redlock真的可行么

    本文是对 Martin Kleppmann 的文章 How to do distributed locking 部分内容的翻译和总结,上次写 Redlock 的原因就是看到了 Martin 的这篇文章 ...

  7. monkey及其的日志管理和分析

    1.   monkey 1.1.  介绍 通过monkey程序模拟用户触摸屏幕,滑动Trackball.按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,检查和评估被测程序的稳定性 ...

  8. 浅谈Linux桌面(发行版及桌面环境)

    Part I: 前言 笔者2018年接触Linux(当时还是学校机房的Ubuntu 14.04 LTS),至今已经有4个年头了. 折腾了至少十几个Linux发行版,包括但不限于: ubuntu.Deb ...

  9. RabbitMQ相关概念的理解

    1.什么是消息? 消息就是程序(服务)之间传递的数据(图/文/声/像). 2.MQ是什么? MQ(MessageQueue)是指消息队列亦或消息总线.是消息的容器,这个容器的策略是FIFO(先进先出) ...

  10. JVM学习(五) -执行子系统

    虚拟机和物理机的区别.两种都有代码执行能力.物理机的执行引擎是建立在处理器.硬件.指令集和操作系统上.而虚拟机的执行引擎是有自己实现的.因此可以自行的制定指令集和执行引擎的结构关系. 个人理解:分为三 ...