public class Test {// 已知数组A是由有序数组B(数组B未知)向右移动n(0<=n<=B.length)位得到// 例如 A = {4, 5, 1, 2, 3} 由 B = {1, 2, 3, 4, 5} 向右移动2位得到// 求在数组A中搜索元素xprivate static int search(int[] a, int h, int t, int x) {if (h > t) return -1;int result = -1;int mid = (h + t) / 2;if (a[mid] == x) return mid;if (a[h] == a[t] && a[h] == a[mid]) {// 这种情况无法判断哪边是递增,那边是旋转数组,如下// a = {5, X, 5, X, 5}// a = {5, 5, 5, 6, 5}// a = {5, 6, 5, 5, 5}result = search(a, h, mid - 1, x);if (result == -1) result = search(a, mid + 1, t, x);} else if (a[h] < a[t]) {result = binarySearch(a, h, t, x);} else {    // a[h] > a[t] || ( a[h] == a[t] && a[h] != a[mid] )if (a[mid] >= a[h]) {// a[h]~a[mid]为递增,a[mid+1]~a[t]为旋转数组result = x >= a[h] ? binarySearch(a, h, mid - 1, x) : search(a, mid + 1, t, x);} else {// a[h]~a[mid]为旋转数组,a[mid+1]~a[t]为递增result = x >= a[mid + 1] ? binarySearch(a, mid + 1, t, x) : search(a, h, mid - 1, x);}}return result;}// 第二种方法,先找出数组移位的位数,然后判断应该在哪一段进行二分查找private static int getMoveStep(int[] a, int h, int t) {if (h >= t) return 0;int low = h;int high = t;int mid = (low + high) / 2;int step = 0;if (a[low] == a[high]) {// 这是一种无法判断哪边是递增序列的情况step = getMoveStep(a, h, mid - 1);if (step == 0) step = getMoveStep(a, mid + 1, t);} else {while (a[low] > a[high]) {mid = (low + high) / 2;if (a[mid] >= a[low]) {// 递增序列在mid左边step = low = mid + 1;} else {// 递增序列在mid右边high = mid - 1;}}}return step;}// 利用y移位次数查找private static int searchByMove(int[] a, int x) {int result;int step = getMoveStep(a, 0, a.length - 1);if (step != 0) {result = x > a[0] ? binarySearch(a, 0, step - 1, x) : binarySearch(a, step, a.length - 1, x);} else {result = binarySearch(a, 0, a.length - 1, x);}return result;}private static int binarySearch(int[] a, int h, int t, int x) {int low = h;int high = t;int mid;while (low <= high) {mid = (low + high) / 2;if (a[mid] == x) {return mid;} else if (a[mid] < x) {low = mid + 1;} else {high = mid - 1;}}return -1;}public static void main(String[] args) {int[] a = {4, 5, 1, 2, 3};int[] b = {5, 5, 5, 7, 5};int[] c = {5, 3, 5, 5, 5};int[] d = {5, 5, 3, 4, 5, 5, 5};int[] e = {5, 5, 5, 5, 5};int[] f = {1, 2, 3, 4, 5};System.out.println(search(a, 0, a.length - 1, 1));System.out.println(search(b, 0, b.length - 1, 7));System.out.println(search(c, 0, c.length - 1, 3));System.out.println(search(d, 0, d.length - 1, 3));System.out.println(search(e, 0, e.length - 1, 3));System.out.println(search(f, 0, f.length - 1, 2));System.out.println();System.out.println(searchByMove(a, 1));System.out.println(searchByMove(b, 7));System.out.println(searchByMove(c, 3));System.out.println(searchByMove(d, 3));System.out.println(searchByMove(e, 3));System.out.println(searchByMove(f, 2));}
}

Java 旋转数组查找旋转点和任意元素(元素可重复)相关推荐

  1. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...

    java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...

  2. java旋转数组查找某一个值_旋转数组中查找某个元素

    在一个排序的数组中,如{1,2,3,4,5,6,7},经过旋转后得到{4,5,6,7,1,2,3},当然也可以得到原数组{1,2,3,4,5,6,7},在该旋转后的数组中查找某个元素. 旋转后的数组可 ...

  3. java旋转数组最小值,旋转数组的最小数字

    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  4. 【算法编程】旋转数组查找最小数字

    题目来源:牛客网 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2, ...

  5. java的数组查找算法_java数组、排序算法、查找算法详解

    1.为什么定义数组要采用type[] arrayName;这种方式? 因为这种方式具有很好的可读性,使用这种方式很容易就可以理解这是定义一个变量,其中变量名是arrayName,变量的类型是type[ ...

  6. java char数组查找_我爱java系列---【在字符数组中查询某个字符串是否存在】

    mysql中的FIND_IN_SET函数 需求:根据省份id,查询可以在该省份下发信息的通道id sql语句: SELECT cpa.CHANNEL_ID id FROM channel_price_ ...

  7. java里css查找快捷键_CSS入门2—元素快捷键

    在编写Css代码的过程中,使用元素快捷键可以很大的提高开发的效率,以下是webstorm编辑器中的elemt快捷方式: 一.子集关系:">" 1.书写格式:父级元素>子 ...

  8. 输出一个为递增排序数组的旋转数组中的最小元素——8

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为数组{1, 2,3, 4, 5}的一个旋转, ...

  9. 剑指offer面试题[8]-旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

最新文章

  1. python英文单词-python常用150个英文单词
  2. 【Leetcode】几种简单的排序算法
  3. SAP Spartacus lock directive锁住元素所有子元素及设置FOCUS_GROUP_ATTR的行为
  4. 前端学习(381):CSS3 的视口单位vw、vh实现自适应(带有px,em,rem的简单介绍)
  5. Pycharm结合Anaconda结合使用下的能够产生作用的Anaconda命令
  6. 高精度练习(hdoj1042)
  7. 【斯坦福大学新研究】声波、光波等都是RNN
  8. 经典论文之OverFeat
  9. 迅雷9解决php文件,迅雷9的这些优化 你必须要知道
  10. Activity跳转并传递
  11. LAMP架设论坛空间
  12. 如何区分前后端bug
  13. html和css中盒子大小,CSS大小设置实例——盒子模型
  14. 【Q - Phalanx】
  15. HTML自学笔记-1(进入篇)
  16. 祥云杯2022 writeup
  17. 【kafka实战】分区重分配可能出现的问题和排查问题思路(生产环境实战,附视频)
  18. 智能卡应用的开发流程
  19. 【学习笔记】【计算机组成原理】定点数与浮点数的运算;LRU算法实现;cache命中;流水线冲突、冲刷;
  20. SSL,TLS协议与OpenSSL 心血heartbleed漏洞之伤

热门文章

  1. excel函数大全_让你的EXCEL工作效率翻倍的函数大全
  2. AutoML初创公司探智立方:模型的物竞天择与适者生存
  3. [转] 利用CORS实现跨域请求
  4. python--内置函数
  5. 测试用例实例--常见功能测试点(转)
  6. [转]计算机读研的取向
  7. ssh不断开的设置方法
  8. PC/UVA 110207/10258
  9. go get 获取被墙依赖包解决方法
  10. 同一DIV内,两个行内块元素不对齐的解决方案