leetcode 33和 leetcode81 II
//接上上一篇博客,继续这个题目,现在数组中会有重复元素,情况将会变得十分复杂,比如说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的更多相关文章
- leetcode 33和 leetcode81
//感想: 1.对于这两题,我真的是做到吐,这篇博客本来是昨晚准备写的,但是对于这个第二题,我真的做到头痛,实在是太尼玛的吐血了,主要是我也是头铁,非要找到那个分界点. 2.其实之前在牛客网上做过非常 ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>
LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- LeetCode:组合总数II【40】
LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...
- leetcode 33. 搜索旋转排序数组 及 81. 搜索旋转排序数组 II
33. 搜索旋转排序数组 问题描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定 ...
随机推荐
- Idea启动报错 Error:java: System Java Compiler was not found in classpath
报错信息:Error:java: System Java Compiler was not found in classpath 使用IDEA启动的时候出现了这个错误,查找了很久,才找到解决办法 1. ...
- jvm内存查看方法----个人参考版
查看设置JVM内存信息 1 Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx 2 3 Runtime.getRuntime().freeMemory( ...
- Longest common subsequence(LCS)
问题 说明该问题在生物学中的实际意义 Biological applications often need to compare the DNA of two (or more) different ...
- C# stopwatch的简单使用(计算程序执行时间)
首先添加引用 using System.Diagnostics;//stopwatch的引用 //声明变量 Stopwatch a=new Stopwatch();//PS:这里一定要new(实例化) ...
- python使用redis缓存数据库
Redis 关注公众号"轻松学编程"了解更多. Windows下直接解压可用,链接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA ...
- python开发初识(一)
python开发 机器码和字节码 机器码 :计算机可以直接认识的语言 字节码 :高级语言转换成机器码去执行 语言之间的对比: C,汇编 :C语言是根语言 python Java :既能写前端,又能写后 ...
- 【SpringBoot】12.全局配置文件(properties)与yml配置文件
一.SpringBoot全局配置文件 1.修改内嵌容器端口号 #application.properties server.port=8888 2.自定义属性的配置 使用@Value来给成员变量赋值 ...
- CDM 设置 主键自增
一些朋友在用PD建概念模型时,觉得主键无法设置自增,还需要在生成PDM后,单独再设置一次,很麻烦. 自增主键一般都是整形,int ,long 如果我们在CDM建实体模型时,将自增主键设置为Serial ...
- ASP.NET Core 中基于工厂的中间件激活
IMiddlewareFactory/IMiddleware 是中间件激活的扩展点. UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware. 如果是,则使用在容器 ...
- 使用JAVA API读取HDFS的文件数据出现乱码的解决方案
使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...