常考数据结构与算法:在转动过的有序数组中寻找目标值
题目描述
给出一个转动过的有序数组,你事先不知道该数组转动了多少
(例如,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,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 常考数据结构与算法:求二叉树的层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...
- 常考数据结构与算法:找到字符串的最长无重复字符子串
题目描述 给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同). 示例1 输入 [2,3,4,5] 返回值 4 示例2 输入 [2,2,3,4,3] 返回值 3 方法 ...
- 常考数据结构与算法:删除链表的倒数第n个节点
题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...
- 常考数据结构与算法:最长公共子串
题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...
- 常考数据结构与算法:两个链表生成相加链表
题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数. 给定两个这种链表,请生成代表两个整数相加值的结果链表. 例如:链表 1 为 9->3->7,链表 ...
- 常考数据结构与算法:买卖股票的最好时机
题目描述 假设你有一个数组,其中第 i 个元素是股票在第i 天的价格. 你有一次买入和卖出的机会.(只有买入了股票以后才能卖出).请你设计一个算法来计算可以获得的最大收益. 示例 1: 输入: [8, ...
- 常考数据结构和算法:设计LRU缓存结构
题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...
- 常考数据结构与算法:每k个节点反转链表
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
最新文章
- linux下的oracle10g rman备份
- 0x00000000指令引用的内存不能为written_jvm的内存结构
- hex文件和bin文件区别
- 防止MDI子窗体多次实例化的代码
- 数据挖掘流程(四):建模调参
- JAVA基础实例(一)
- 鸿蒙开发-从搭建todolist待办事项来学习组件与js之间的交互
- iOS开发网络篇—网络请求(HTTP协议)小结(转)
- python解析xml文件elementtree_Python中使用ElementTree解析XML示例
- AOE网的关键路径的计算
- TensorFlow tf.keras.layers.Lambda
- 蓝桥杯 BASIC-19 基础练习 完美的代价
- sphinx下的max_matches取值对SetLimits的影响
- 如何给你的Android 安装文件(APK)瘦身
- ofd文件的查看、打印、下载、上传
- 关于EAN13码的设置问题
- java mocked_java – 使mocked方法返回传递给它的参数
- Win系统EPUB阅读软件评测
- iphone竖屏视频旋转_如何在iPhone上旋转视频
- 关于PMSM电机FOC驱动的一些问题