题目描述

给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).
在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。
假设数组中不存在重复项。

思路:

首先判断排序数组是否翻转,如果没有翻转,直接使用二分查找,如果翻转,先使用变种的二分查找找到翻转位置,再分别在前半段与后半段进行二分查找寻找目标值。

public class HalfSearch {public static void main(String[] args) {//int[] a = {1,3,5,7,9,11};int[] a = {3,5,7,9,11,1};//int [] a ={9,11 ,1 ,3, 5 ,7};HalfSearch halfSearch = new HalfSearch();int index = halfSearch.search(a, 67);System.out.println(index);}/**** @param A int整型一维数组* @param target int整型* @return int整型*/public int search (int[] A, int target) {// 如果没有反转,直接使用二分查找if(A[0] < A[A.length-1]){return binarySearch(A, 0, A.length-1, target);}// {1,3,5,7,9,11};  9,11 1 3 5 7   {9,11 ,1 ,3, 5 ,7}// 如果翻转,先使用变种的二分查找找到翻转位置,再分别在前半段与后半段进行二分查找寻找目标值。// 找到旋转点int start = 0;int end = A.length-1;
//        while(start <= end){
//            int middle = (start + end) >> 1;
//            if(A[middle] > A[end]){
//                start = middle + 1; // 旋转点在右边
//            }else if(A[middle] < A[end]){
//                end = middle - 1; // 旋转点在左边
//            }else{break;}
//        }while(start < end){int middle = (start + end) >> 1;if(A[middle] > A[end]){start = middle + 1; // 旋转点在右边}else {end = middle ; // 旋转点在左边}}int ret = binarySearch(A, 0, start-1, target);if(-1 == ret){ret = binarySearch(A, start, A.length-1, target);}return ret;}// 二分法public int binarySearch(int[] A, int begin, int end, int target){while(begin<=end){int middle = (end+begin) >> 1;if(A[middle] < target){begin = middle+1;}else if(A[middle] > target){end = middle-1;}else{return middle;}}return -1;}
}

常考数据结构与算法:在转动过的有序数组中寻找目标值相关推荐

  1. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  2. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  3. 常考数据结构与算法:找到字符串的最长无重复字符子串

    题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...

  4. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  5. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  6. 常考数据结构与算法:两个链表生成相加链表

    题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 例如:链表 1 为 9->3->7,链表 ...

  7. 常考数据结构与算法:买卖股票的最好时机

    题目描述 假设你有一个数组,其中第 i 个元素是股票在第i 天的价格. 你有一次买入和卖出的机会.(只有买入了股票以后才能卖出).请你设计一个算法来计算可以获得的最大收益. 示例 1: 输入: [8, ...

  8. 常考数据结构和算法:设计LRU缓存结构

    题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...

  9. 常考数据结构与算法:每k个节点反转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

最新文章

  1. linux下的oracle10g rman备份
  2. 0x00000000指令引用的内存不能为written_jvm的内存结构
  3. hex文件和bin文件区别
  4. 防止MDI子窗体多次实例化的代码
  5. 数据挖掘流程(四):建模调参
  6. JAVA基础实例(一)
  7. 鸿蒙开发-从搭建todolist待办事项来学习组件与js之间的交互
  8. iOS开发网络篇—网络请求(HTTP协议)小结(转)
  9. python解析xml文件elementtree_Python中使用ElementTree解析XML示例
  10. AOE网的关键路径的计算
  11. TensorFlow tf.keras.layers.Lambda
  12. 蓝桥杯 BASIC-19 基础练习 完美的代价
  13. sphinx下的max_matches取值对SetLimits的影响
  14. 如何给你的Android 安装文件(APK)瘦身
  15. ofd文件的查看、打印、下载、上传
  16. 关于EAN13码的设置问题
  17. java mocked_java – 使mocked方法返回传递给它的参数
  18. Win系统EPUB阅读软件评测
  19. iphone竖屏视频旋转_如何在iPhone上旋转视频
  20. 关于PMSM电机FOC驱动的一些问题

热门文章

  1. 批量镜像locator(比如表情模板)
  2. [SQL] 外卖系统数据库设计
  3. InnoDB Master Thread I/O Rate详解
  4. JNI中java类型的简写
  5. 实现Unity编辑器模式下的旋转
  6. Java 面向对象编程、jQuery、JavaScript、servlet、javabean----理论知识
  7. 强大Jquery插件,table排序之二
  8. 实模式与保护模式详解三:寻址方式
  9. Spring Boot 自动配置之条件注解
  10. 京东618:六年历程步步为营,京东商城的安全保卫战