数组

1. 二分法

    思想:先确定待查记录所在的区间,然后逐步缩小查找范围直到找到或找不到该记录为止。

    时间复杂度:O(logn)

    游标:下限 low,上限 high,中间划分 mid = low + (high - low)/2

    查找元素是否存在:循环结束条件 low<=high,循环中断条件 nums[mid]==target,划分结果 [low, mid), (mid,high]

int binarySearch(int[] nums, int target) {
    int low=0, high=nums.length;
    while(low<=high) {
        int mid=low+(high-low)/2;
        if(nums[mid]==target) {
            return mid;
        }
        if(nums[mid]<target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;
}
    变种:实现要多注意边界值的判断。   
    1) 在一个有重复元素的数组中查找元素的最左位置。
int binarySearchLeft(int[] nums, int target) {
    int low=0, high=nums.length;
    while(low<=high) {
        int mid=low+(high-low)/2;
        if(nums[mid]==target && (mid==0 || nums[mid-1]!=target)) {
            return mid;
        }
        if(nums[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return low;
}
public int binarySearch(int[] nums, int key) {
    int l = 0, h = nums.length - 1;
    while (l < h) {
        int m = l + (h - l) / 2;
        if (nums[m] >= key)
            h = m;
        else
            l = m + 1;
    }
    return l;
}

    2) 在一个有重复元素的数组中查找元素的最左位置。

int binarySearchRight(int[] nums, int target) {
    int low=0, high=nums.length;
    while(low<=high) {
        int mid=low+(high-low)/2;
        if(nums[mid]==target && (target==nums.length-1 || nums[mid+1]!=target)) {
            return mid;
        }
        if(nums[mid]<=target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return low;
}


    3) 查找元素位置

int binarySearchRight(int[] nums, int target) {
    int low=0, high=nums.length;
    while(low<high) {
        int mid=low+(high-low)/2;
        if(nums[mid]<=target && target<nums[mid+1]) {
            return mid;
        }
        if(nums[mid]<target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return low;
}

阅读更多
文章标签: 数据结构
博主设置当前文章不允许评论。

数组的使用小例子,有用啊

2009年05月30日 18KB 下载

VBA数组VBA数组VBA数组

2010年07月14日 187KB 下载

Java数组分析

2017年04月12日 47KB 下载

java入门及数组.rar

2010年11月24日 458KB 下载

JAVA迷宫,JAVA语言,数组

2008年10月26日 126KB 下载

输入数组找最大值

2018年01月10日 220B 下载

C#数组集合pptC#数组集合

2009年04月25日 1.16MB 下载

顺序数组的实现

2014年04月18日 2KB 下载

没有更多推荐了,返回首页

不良信息举报

数组

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭