问题描述:反转序列,但是有重复的元素,例如序列13111。

算法思路:如果元素有重复,那么left-mid,就不一定是有序的了,所以不能利用二分搜索,二分搜索必须是局部有序。针对有序序列的反转,如果有重复数据的话,那么必然是nums[left]=nums[mid]=nums[right],增加对这种情况的讨论即可。

 public boolean search(int[] nums, int target)
{
return binarySearch(nums, 0, nums.length - 1, target);
}
//递归方法
public boolean binarySearch(int[] nums, int left, int right, int target)
{
//不要忘了这个边界条件。
if(left > right)
{
return false;
}
int mid = (left + right)/2;
if(target == nums[mid])
{
return true;
} //假设序列为13111,那么nums[mid]=nums[right]=nums[left],left和mid之间就不是有序序列了。
//并且这种特殊情况,只可能是nums[mid]=nums[left]=nums[right],所以,移动left和right.
//二分查找的关键就是要局部序列有序。
if(nums[left] == nums[mid] && nums[mid] == nums[right])
{
return binarySearch(nums, left + 1, right - 1, target);
} else if(nums[left] <= nums[mid])//做连续,要包含"="的情况,否则出错。
{
if(target >= nums[left] && target < nums[mid])//target上下限都要有
{
return binarySearch(nums, left, mid - 1, target);//记得return
}
else
{
return binarySearch(nums, mid + 1, right, target);
}
}
else
{
if(target > nums[mid] && target <= nums[right])
{
return binarySearch(nums, mid + 1, right, target);
}
else
{
return binarySearch(nums, left, mid - 1, target);
}
}
} //迭代方法
public boolean binarySearch2(int[] nums, int left, int right, int target)
{ while(left <= right)
{
int mid = (left + right)/2;
if(target == nums[mid])
{
return true;
}
if(nums[left] == nums[mid] && nums[mid] == nums[right])
{
left ++;
right --;
}
else if(nums[left] <= nums[mid]) //左连续,所以要包含=的情况。否则出错。
{
if(target >= nums[left] && target < nums[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
else
{
if(target > nums[mid] && target <= nums[right])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
}
return false;
}

Search In Rotated SortedArray2, 有重复数据的反转序列。例如13111.的更多相关文章

  1. 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. ...

  2. Find Min In Rotated Sorted Array2,包含重复数字的反转序列找最小值。

    public int findMin(int[] nums) { return findMin(nums, 0, nums.length - 1); } public int findMin(int[ ...

  3. LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

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

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  5. 【leetcode】Search in Rotated Sorted Array II(middle)☆

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  6. Search in Rotated Sorted Array II leetcode

    原题链接,点我 该题解题参考博客 和Search in Rotated Sorted Array唯一的区别是这道题目中元素会有重复的情况出现.不过正是因为这个条件的出现,出现了比较复杂的case,甚至 ...

  7. LeetCode:Search in Rotated Sorted Array I II

    LeetCode:Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to y ...

  8. Search in Rotated Sorted Array I

    Search in Rotated Sorted Array I Suppose a sorted array is rotated at some pivot unknown to you befo ...

  9. [LeetCode]题解(python):081 - Search in Rotated Sorted Array II

    题目来源 https://leetcode.com/problems/search-in-rotated-sorted-array-ii/ Follow up for "Search in ...

随机推荐

  1. jpa双向一对多关联映射

    表结构 Room类 package auth.model; import java.util.HashSet; import java.util.Set; import javax.persisten ...

  2. 【Lombok】了解

    项目中使用了 Lombok ,对象无需写get set 等方法,一个注释便可以搞定.IDEA中项目报错,下载对应插件(Lombok Plugin)就好了.很神奇,就了解一下: 官网: Project ...

  3. Java版斯诺克开源分享

    Java版斯诺克开源分享 这个小程序是我平时无聊写着玩的,在网盘里躺了好久了,今天就把它拿出来跟大家分享一下,下面是游戏截图: 请不要吐槽这个界面,斯诺克的球台是我从qq游戏里面截取的... 下面是源 ...

  4. delphi ----日期控件运用,日期问题,日期时间比较

    一.日期控件 1.DateTimePicker 1)只显示年月 DateMode:dmUpDown format:yyyy-MM 2)将DateTimePicker的Format属性中加入日期格式设成 ...

  5. Exchange Version and UpdateRollups

    Exchange Server 2010 Product name Build number Date KB Microsoft Exchange Server 2010 RTM 14.0.639.2 ...

  6. mysql数据库表插入单条数据/批量插入数据

    1.创建表格 reate table trade( id int(4) not null primary key auto_increment, product varchar(30) null, p ...

  7. (4.6)sql2008中的group by grouping sets

    最近遇到一个情况,需要在内网系统中出一个统计报表.需要根据不同条件使用多个group by语句.需要将所有聚合的数据进行UNION操作来完成不同维度的统计查看. 直到发现在SQL SERVER 200 ...

  8. tomcat 日志目录 介绍

    [root@mysql tomcat]# ll 总用量 drwxr-x---. root root 11月 : bin -rw-r-----. root root 11月 : BUILDING.txt ...

  9. Nginx+Springboot+Vue 前后端分离 解决跨域问题

    1:前端vue 写完 打包 npm run build prod 2: 后端api 写完打包 springboot mvn package -Dmaven.test.skip=true 3: ngin ...

  10. Springboot入门-日志框架配置(转载)

    默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台. Logback是log4j框架的作者开发的新一代日志框架,它效率更高.能够适应诸多的运行环境,同时天然支 ...