博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 旋转数组查找旋转点和任意元素(元素可重复)
阅读量:6303 次
发布时间:2019-06-22

本文共 3642 字,大约阅读时间需要 12 分钟。

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中搜索元素x    private 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));    }}

转载地址:http://zoyxa.baihongyu.com/

你可能感兴趣的文章
[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]
查看>>
IOS中图片(UIImage)拉伸技巧
查看>>
【工具】系统性能查看工具 dstat
查看>>
基于zepto或jquery的手机端弹出框成功,失败,加载特效
查看>>
php引用(&)
查看>>
angularjs中的排序方式
查看>>
AngularJS的启动方式
查看>>
Ruby实现冒泡排序
查看>>
angularJS指令中的controller和controllerAs
查看>>
linux NTP 时间服务设置
查看>>
十招防止电脑辐射
查看>>
Android中的组件安全漏洞介绍和检测
查看>>
web之三建立https
查看>>
10个让人眼花缭乱的 HTML5 和 JavaScript 效果
查看>>
用C语言操作Sqlite数据库
查看>>
mac电脑的idea环境显示行号的方式
查看>>
Coding and Paper Letter(十五)
查看>>
java加密解密_____MD5加密(用户名映射(用户名和密码)串)唯一性
查看>>
java实现简单的LL1语法分析器
查看>>
mysql 自定义排序函数field()
查看>>