Search In Rotated SortedArray2, 有重复数据的反转序列。例如13111.
2016-06-09 14:52
246 查看
问题描述:反转序列,但是有重复的元素,例如序列13111。
算法思路:如果元素有重复,那么left-mid,就不一定是有序的了,所以不能利用二分搜索,二分搜索必须是局部有序。针对有序序列的反转,如果有重复数据的话,那么必然是nums[left]=nums[mid]=nums[right],增加对这种情况的讨论即可。
算法思路:如果元素有重复,那么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; }
相关文章推荐
- HDU-2047 阿牛的EOF牛肉串
- Floyd判圈算法(龟兔赛跑算法)
- <Sicily>Rails
- root运行chrome
- BZOJ 1068: [SCOI2007]压缩 区间DP
- 学术会议高手速成之七种武器
- Ubuntu网络配置
- pt-online-schema-change
- 远程控制利器 TeamViewer 使用教程
- excel转变编码格式
- 使用Servlet+jsp构建MVC体系结构的Web应用
- PHPStorm + Xdebug 配置使用教程
- uva1025 a spy in the metro
- Windows Server 2008 R2通过IP安全策略阻止某个IP访问的设置方法
- 关于网页中的无缝滚动的js代码
- DataReader与DataSet
- iOS AutoLayout: UIView 关联 Xib 不设置 File's Owner
- CodeForces 28c Bath Queue(概率dp)
- 让ambarella s2l 支持32M SPI Flash(W25Q256)
- 解决虚拟机桥接的问题