二分查找算法Java实现

概述

今天在牛客网上刷了一道关于数组的面试题,其中运用到的算法为二分查找。因此做如下总结。

试题:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:

有题目可知,数组每行是从小到大排列的,因此我们可以用,二分查找,时间复杂度为log2n。因为该题为二维数组,因此时间复杂度为nlog2n。

算法实现

我们首先从一维数组出发,进而扩充到二维。
一维实现图
在这里插入图片描述

具体代码

public class Solution {
    public boolean Find(int target, int [][] array) {
       boolean flag=false;
        int i, j;
        int indexx;
        int indexy;
        for(i=0;i<array.length;i++){
            indexx = 0;
            indexy = array[i].length-1;
            while(indexy>=indexx){
                int mid =(indexy +indexx) / 2;
                if (target < array[i][mid]) indexy = mid - 1;
                else if (target > array[i][mid]) indexx = mid + 1;
                else {
                    // 该if用于解决相邻元素相同的情况
                    flag= true;
                    indexy=indexx-1;
            }
            }
        }
        return flag;
    }
}

课后小结

二分法通用模板

public static int getPos(int[] A, int n, int val) {
    int x,y,mid;
    x=0;
    y=n-1;
    while(x<=y){
        mid=(x+y)/2;
        if(val<A[mid]){
            y=mid-1;
        }else if(val>A[mid]){
            x=mid+1;
        }else{
            if(mid>0&&A[mid-1]==A[mid])
            return mid-1;
            else
            return mid;
        }
    }
    return -1;
}

今日奖励

时间复杂度计算
求时间复杂度,首先找到算法中的基本语句,而基本语句是啥呢??
基本语句,就是执行次数与整个算法的执行次数成正比的语句,说白了就是,循环次数最多的语句。找打了基本语句,我们也就可以表示出算法的时间复杂度,那么时间复杂度定义是啥呢?
算法中基本语句的执行次数在渐进意义下阶用大O表示。

我们根据几个例题来看看时间复杂度怎么来求

在这里插入图片描述

posted on 2019-08-30 20:47  一颗小白杨站在哨所旁  阅读(140)  评论(0编辑  收藏  举报

导航