01 二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一 暴力求解
1 import java.util.*; 2 public class Solution { 3 public static boolean Find(int target, int [][] array) { 4 5 // 二维数组为空,要检查三个部分: 6 //一是数组首地址是否为空 7 //二是是否为{},也就是array.length==0的情况 8 //三是{{}},这时array.length=1,但是array[0].length==0。满足任意一个条件就可以返回false了 9 if(array==null||array.length==0||(array.length==1&&array[0].length==0)){ 10 return false; 11 }else{ 12 for(int i = 0 ; i < array.length; i++) 13 for(int j = 0; j < array[0].length; j++){ 14 if (target == array[i][j]) return true; 15 } 16 } 17 return false; 18 } 19 20 public static void main(String[] args) { 21 //int [][] array = {{1,2,3},{4,73,6},{7,8,900}}; 22 //boolean result = Find(900, array); 23 //System.out.println("数组中查询的结果是:" + result ); 24 Scanner sc = new Scanner(System.in ); 25 System.out.println("输入二维数组的行数"); 26 int row = sc.nextInt(); 27 System.out.println("输入二维数组的列数"); 28 int col = sc.nextInt(); 29 int [][] array = new int[row][col]; 30 System.out.println("输入数组各个元素"); 31 for(int i=0;i<row;i++){ 32 for(int j=0;j<col;j++) 33 array[i][j]= sc.nextInt(); 34 } 35 boolean result = Find(900, array); 36 System.out.println("数组中查询的结果是:" + result ); 37 } 38 }
思路二
利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;1 public class Solution { 2 public boolean Find(int [][] array,int target) { 3 int row=0; 4 int col=array[0].length-1; 5 while(row<=array.length-1&&col>=0){ //本情况选取的是右上角的元素 6 if(target==array[row][col]) 7 return true; 8 else if(target>array[row][col]) 9 row++; 10 else 11 col--; 12 } 13 return false; 14 15 } 16 }
行长度:array.length
列长度:array[i].length
写左下角元素还是右上角元素都可以,但是一定要写对行和列的长度啊
思路三
把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是nlogn1 public class Solution { 2 public boolean Find(int [][] array,int target) { 3 4 for(int i=0;i<array.length;i++){ 5 int low=0; 6 int high=array[i].length-1; 7 while(low<=high){ 8 int mid=(low+high)/2; 9 if(target>array[i][mid]) 10 low=mid+1; 11 else if(target<array[i][mid]) 12 high=mid-1; 13 else 14 return true; 15 } 16 } 17 return false; 18 19 } 20 }
            
 
作者:shareidea            
 
出处:https://www.cnblogs.com/shareidea94/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。   
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号