package com.example.algorithm.findnumber;
/**
* *
* * 一个二维数组,每一行从左到右递增,每一列从上到下递增.
* * 输入一个二维数组和一个整数,判断数组中是否含有整数.
*
* @author tengxiang
* @date 2020/5/13
* @since 1.0
*/
public class FindNumber3 {
/**
* 解法一:双指针
* 时间复杂度:O(mn),空间复杂度:O(1)
* @param array
* @param target
* @return
*/
public static boolean find(int[][] array,int target){
if(array == null || array.length == 0){
return false;
}
int row = 0;
int col = array[0].length - 1;
while(col >= 0 && row < array.length ){
if(array[row][col] == target){
return true;
}else if(array[row][col] > target){
col--;
}else{
row++;
}
}
return false;
}
/**
* 解法二:二分法
* 时间复杂度:O(log mn),空间复杂度:O(1)
* @param array
* @param target
* @return
*/
public static boolean find2(int[][] array,int target) {
if(array == null || array.length == 0){
return false;
}
int left = 0;
int right = array.length * array[0].length - 1;
int col = array[0].length;
while (left <= right){
int mid = (left + right)/2;
int midNum = array[mid/col][mid%col];
if(midNum == target){
return true;
}else if(midNum > target){
right = mid -1;
}else {
left = mid + 1;
}
}
return false;
}
public static void main(String[] args) {
int[][] arr = {{1,2},{4,6},{6,7}};
System.out.println(find2(arr,1));
}
}