题目描述

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

解题思路

从题意我们可以知道最小数是第一行第一个,最大数是最后一行的最后一个,每一行最大的一个数是每一行的最后一个,每一行最小一个数是每一行的第一个。
所以我们从第一行的最后一个数开始比较假定这个值为 temp,如果目标值 target 大于 temp,那么与下一行的数值进行比较,因为下一行的值比上一行的值大;如果目标值 target 小于 temp,那么与前一列的数值进行比较,因为前一列的值比后一列的值小。如此循环直到找到这个数返回 true,或者所有的数都被查找过返回 false。

代码实现

  1. import java.util.Scanner;
  2. public class Problem1 {
  3. public static boolean Find(int target, int [][] array) {
  4. if(array == null){
  5. return false;
  6. }
  7. int n = array.length;
  8. int m = array[0].length;
  9. int i = 0;
  10. int j = m - 1;
  11. while(i < n && j >= 0){
  12. int temp = array[i][j];
  13. if(target < temp){
  14. j--;
  15. }
  16. else if(target > temp){
  17. i++;
  18. }
  19. else{
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. public static void main(String[] args) {
  26. Scanner cin = new Scanner(System.in);
  27. int[][] array = new int[2][2];
  28. for (int i = 0; i < 2; i ++) {
  29. for (int j = 0; j < 2; j ++) {
  30. array[i][j] = cin.nextInt();
  31. }
  32. }
  33. int target = cin.nextInt();
  34. System.out.println(Find(target, array));
  35. }
  36. }