Search in Rotated Sorted Array - 循环有序数组查找问题
两道题
33. Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/
81. Search in Rotated Sorted Array II
https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
这两道题都是属于循环有序数组的查找问题,无论是查找具体元素的下标还是检查一个目标值是否在数组中,主要的判断逻辑都是一致的。
思路
这种将有序数组翻转成循环有序数组的解决办法是将原数组分段。用首元素start、中间元素mid、尾元素end,可以将数组分为两个子数组s1,s2。
则这两个子数组中,必然有至少一个子数组是有序的。
那么如何确定那一段是有序的呢,通过分析可以看到只有3种情况:
- 当start就是A中最小的元素时,以下不等式成立:start <= mid <= end
- 当最小值位于(start, mid]时,则有:mid <= end <= start
- 当最小值出现在(mid,end]时,则有:end <= start <= mid
所以通过start, mid, end的大小关系,就可以判断出s1和s2哪个是有序的。
通过比较要查找的目标target与start,mid,end的大小关系,就可以知道target位于哪个子数组。
若target位于有序的子数组,则用二分查找就可以了。否则,对无序的子数组重复刚才的过程就可以了。
代码
package com.lingyejun.dating.chap11.toutiao;public class RotatedArrayQuery {/*** 33. Search in Rotated Sorted Array* 查找目标值下标** @param nums* @param target* @return*/public int searchTargetIndex(int[] nums, int target) {int start = 0;int end = nums.length - 1;while (start <= end) {// (start ... middle ... end)int mid = (start + end) / 2;if (nums[mid] == target) {return mid;}// 前半段数组是有序的if (nums[start] < nums[mid]) {// target在前半段数组中if (target < nums[mid] && target >= nums[start]) {// 将原数组折半,取出前半段数组end = mid - 1;} else {// target在后半段数组中start = mid + 1;}}// 后半段数组是有序的else if (nums[mid] < nums[end]) {// target在后半段数组中if (target > nums[mid] && target <= nums[end]) {// 将原数组折半,取出后半段数组start = mid + 1;} else {// target在前半段数组中end = mid - 1;}} else {// 此种场景{1, 0, 1, 1, 1} start = mid = endstart++;}}return -1;}/*** 81. Search in Rotated Sorted Array II** 查找是否存在目标值** @param nums* @param target* @return*/public static boolean searchExistsKey(int nums[], int target) {int start = 0;int end = nums.length - 1;while (start <= end) {int mid = (start + end) / 2;if (nums[mid] == target) {return true;}if (nums[start] < nums[mid]) {if (nums[start] <= target && target < nums[mid]) {end = mid - 1;} else {start = mid + 1;}} else if (nums[start] > nums[mid]) {if (nums[mid] < target && target <= nums[end]) {start = mid + 1;} else {end = mid - 1;}} else {start++;}}return false;}public static void main(String[] args) {int[] array = new int[]{1, 0, 1, 1, 1};RotatedArrayQuery caq = new RotatedArrayQuery();System.out.println(caq.searchTargetIndex(array, 0));System.out.println(caq.searchExistsKey(array, 1));}}
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
首发链接:Search in Rotated Sorted Array - 循环有序数组查找问题 - 翎野君 - 博客园
Search in Rotated Sorted Array - 循环有序数组查找问题相关推荐
- python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...
题目描述: python实现Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...
- LeetCode Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would t ...
- LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- leetcode 81 Search in Rotated Sorted Array II ----- java
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- 81. Search in Rotated Sorted Array II
题目: Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would ...
- LeetCode 33. Search in Rotated Sorted Array
问题链接 LeetCode 33. Search in Rotated Sorted Array 题目解析 给定一个 "升序" 的 无重复 数组,从中寻找目标值."升序& ...
- 62. Search in Rotated Sorted Array【medium】
62. Search in Rotated Sorted Array[medium] Suppose a sorted array is rotated at some pivot unknown t ...
- Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
- LeetCode Online Judge 题目C# 练习 - Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...
最新文章
- angular6 mysql_Angular6项目搭建
- 关于Git你必须知道的
- Android 5.0及以上实现屏幕截图
- BugkuCTF-WEB题速度要快
- 【POJ】3255 Roadblocks(次短路+spfa)
- (python)查看糗事百科文字 点赞 作者 等级 评论
- opencv在手机上实现照片背景虚化
- SQL Server 2008 R2 安装
- 对计算机组装和维护课的总结,计算机组装与维护教师工作总结
- linux 下安装ecos开发环境,Ubuntu 10.04中安装eCos 3.0
- GoldenGate实施参考
- 1-n整数中1出现的次数
- access violation at address in module Read of address
- 常见物理性能测试仪器设备档案
- 如果你毕业想进央企, 那就选这些大学, 性价比很高
- 设置华为路由器的端口映射
- LCP 03. 机器人大冒险-力扣双百代码
- 精彩正定 激情古城——2008中国.正定摄影艺术大展盛大开幕
- 量子计算计算机简史pdf,量子计算与量子信息简介.pdf
- 记录徒手解决cranberry病毒的过程
热门文章
- java压测服务器_Java简单模拟设备压测服务器(Rabbitmq)
- 《Pruning from Scratch》论文笔记
- 【java编程思想002】操作符
- 微课竞赛系统的设计与实现所需工作条件_全国高校教师教学竞赛备赛与设计专题研修...
- android 下载zip文件并解压
- 隐藏域在Ajax中的应用
- linux中fstab文件的作用,如何在Linux上写入fstab文件 | MOS86
- 【Linux内核分析与驱动编程】添加内核补丁
- PC_app自动化程序测试(一)
- scribe日志收集