概述
今天在牛客网上刷了一道关于数组的面试题,其中运用到的算法为二分查找。因此做如下总结。
试题:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
有题目可知,数组每行是从小到大排列的,因此我们可以用,二分查找,时间复杂度为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表示。