重拾数据结构(二)

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值