标签:[] array 整数 递增 自己 结束 优化 als lse
题不再难,在于优化
这道题之前做过。
题目是:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
之前自己做的时间复杂度略高。主要的思路是目标数是target,首先与二维数组的第一行最后一列的数比较,与target比较的数如果大于等于target,根据题目中数组的特性,说明有可能在这一行中,遍历这一行与target比较,如果有,返回true;如果没有在此行中,继续与下一行最后一列的数字比较,继续判断。代码如下:
1 public static boolean Find(int target, int [][] array) { 2 //从第一行开始 3 for(int i=0;i<array.length;i++){ 4 //从最后一列开始 5 int j = array[i].length-1; 6 //for(int j = array[i].length-1;j>=0;j--){ 7 //如果最后一列的数比目标数大,就挨个与这一行的每个数进行比较。 8 if(array[i][j] >= target){ 9 for(int k:array[i]){ 10 if(k==target){ 11 return true; 12 } 13 } 14 } 15 //} 16 } 17 return false; 18 }
最坏的情况,查找不到target时,时间复杂度为O(n^2).
书中给出了更为优化的代码,时间复杂度为O(n),如下:
1 public static boolean find0(int target, int [][] array){ 2 boolean Found = false; 3 int row = 0; 4 int column = array[0].length-1; 5 6 if(array!=null && array.length >0 && array[0].length> 0){ 7 8 while(row < array.length && column >= 0){ 9 if(array[row][column] == target){ 10 Found = true; 11 break; 12 }else if(array[row][column]>target){ 13 column--; 14 }else{ 15 row++; 16 } 17 18 } 19 20 } 21 22 return Found; 23 }
主要是用了排除多余的行与列,缩小范围的方法。
根据给出数组的特性,首先选取数组右上角的数字。如果该数字等于要查找的数字,则查找过程结束。如果该数字大于要查找的数字,则去除该数字所在列。如果该数字小于要查找的数字,则去除该数字所在行。这样逐步缩小范围,或者找到要查找的数字,或者查找范围为空。
还是那句话,优化很重要。
标签:[] array 整数 递增 自己 结束 优化 als lse
原文地址:https://www.cnblogs.com/weiziqiang/p/8886563.html