重拾数据结构(二)

来源:互联网 发布:淘宝客连接转换api 编辑:程序博客网 时间:2024/04/29 09:28

1.字符串:子串就是字符串中任意个连续的字符组成的子序列。例:有字符串String str = “abbbcdfee”,那么“a”,“ab”,"abb","bbb","cdf"等都是字符串str的子床,重点是连续“ac”由字符“a”与“c”组成,但是“ac”不是str的子串,另:“”也是str的子串,即str的有一个空子串,且空子串所有字符串的一个子串。

2,二分查找:

递归二分查找:

public int recursiveBinarySearch(int[] a, int target) {    int hi = a.length - 1;    int mid = hi/2;    int middleValue = a[mid];    int[] tmp;    if (target > middleValue) {        tmp = Arrays.copyOfRange(a, mid + 1, hi);    } else if (target < middleValue) {        tmp = Arrays.copyOfRange(a, 0, mid - 1);    } else {        /**         * 此处有问题middleValue转为整型对象Integer,虽然还是100,但是内存地址与Arrays.asList(a)中的100对象地址不一样,返回值会为-1         */        return Arrays.asList(a).indexOf(middleValue);    }    return recursiveBinarySearch(tmp, target);}
此代码效率低下,同时会生成大量的中间数组,带改进。

常规二分查找:

public int binarySearch(int[] a, int target) {    int lo = 0;    int hi = a.length - 1;    while (lo <= hi) {        int mid = lo + ( hi - lo) /2;        if (target < a[mid]) {            hi = mid - 1;        } else if (target > a[mid]) {            lo = mid + 1;        } else {            return mid;        }    }    return -1;}
这个方法是二分查找的正确姿势
追加正确姿势的递归二分查找:
public int recursiveBinarySearch(int[] a, int target, int start, int end) {    int mid = start + (end - start) / 2;    if (target > a[mid]) {        return recursiveBinarySearch(a, target, mid + 1, end);    } else if (target < a[mid]) {        return recursiveBinarySearch(a, target, start, mid - 1);    } else {        return mid;    }}


0 0
原创粉丝点击