两道题

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种情况:

  1. 当start就是A中最小的元素时,以下不等式成立:start <= mid <= end
  2. 当最小值位于(start, mid]时,则有:mid <= end <= start
  3. 当最小值出现在(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 - 循环有序数组查找问题相关推荐

  1. python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...

    题目描述: python实现Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  2. LeetCode Search in Rotated Sorted Array II

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

  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 81 Search in Rotated Sorted Array II ----- java

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

  5. 81. Search in Rotated Sorted Array II

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

  6. LeetCode 33. Search in Rotated Sorted Array

    问题链接 LeetCode 33. Search in Rotated Sorted Array 题目解析 给定一个 "升序" 的 无重复 数组,从中寻找目标值."升序& ...

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

  8. Search in Rotated Sorted Array II

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

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

最新文章

  1. angular6 mysql_Angular6项目搭建
  2. 关于Git你必须知道的
  3. Android 5.0及以上实现屏幕截图
  4. BugkuCTF-WEB题速度要快
  5. 【POJ】3255 Roadblocks(次短路+spfa)
  6. (python)查看糗事百科文字 点赞 作者 等级 评论
  7. opencv在手机上实现照片背景虚化
  8. SQL Server 2008 R2 安装
  9. 对计算机组装和维护课的总结,计算机组装与维护教师工作总结
  10. linux 下安装ecos开发环境,Ubuntu 10.04中安装eCos 3.0
  11. GoldenGate实施参考
  12. 1-n整数中1出现的次数
  13. access violation at address in module Read of address
  14. 常见物理性能测试仪器设备档案
  15. 如果你毕业想进央企, 那就选这些大学, 性价比很高
  16. 设置华为路由器的端口映射
  17. LCP 03. 机器人大冒险-力扣双百代码
  18. 精彩正定 激情古城——2008中国.正定摄影艺术大展盛大开幕
  19. 量子计算计算机简史pdf,量子计算与量子信息简介.pdf
  20. 记录徒手解决cranberry病毒的过程

热门文章

  1. java压测服务器_Java简单模拟设备压测服务器(Rabbitmq)
  2. 《Pruning from Scratch》论文笔记
  3. 【java编程思想002】操作符
  4. 微课竞赛系统的设计与实现所需工作条件_全国高校教师教学竞赛备赛与设计专题研修...
  5. android 下载zip文件并解压
  6. 隐藏域在Ajax中的应用
  7. linux中fstab文件的作用,如何在Linux上写入fstab文件 | MOS86
  8. 【Linux内核分析与驱动编程】添加内核补丁
  9. PC_app自动化程序测试(一)
  10. scribe日志收集