《剑指offer》之二维数组中的查找

我不是女神ヾ 2023-07-02 11:23 65阅读 0赞

前言

在家呆着没什么是做,做今天开始每天刷一道算法题吧。不多不少,重在自己能坚持下去。所有的算法题都是用Java写的,有兴趣的小伙伴可以一起啊。

题目

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

分析

这道题目是一个有序的二维数组,给我们一个数判断这个数是否在二维数组中。这里的重点是判断,二不用对二维数组进行校验,所以这里实现气来其实也比较简单。

解法一

我们完全可以暴力解决,遍历这个二维数组,判断是否在其中。

  1. public boolean Find(int target, int [][] array) {
  2. if(array==null|| array.length <= 1){
  3. return false;
  4. }
  5. for(int i=0;i<array.length;i++){
  6. for (int j = 0; j < array[0].length; j++) {
  7. if(array[i][j]==target){
  8. return true;
  9. }
  10. }
  11. }
  12. return false;
  13. }

但是这样很明显没有用到二维数组有序的这个条件,也就算不上一道算法题了。

解题二

既然上面说了,我们就充分利用有序才行。
我们中二维数组应该是类似下列的形式

1 2 3 4
2 3 4 6
4 5 7 8

如果目标数小于每行的最后一个数,则目标数可能在这一行,从这一行往前找,如果发现某一个值小于目标值,就从下一行最后一个值开始找。
比如上面的例子,需要找5 的话
1、先5和第一行的最后一个值4比较,大于4。i++
2、5和第二行的6比较,小于6 。j–
3、5和第二行的4 比较,大于4。i++
4、5 和第三行的8比较,小于8 。j–
5、5 和第三行的7比较,小于7 。j–
6、5 和第三行的5比较,等于5 。返回true

所以代码如下:

  1. public static boolean find(int [][] array,int target) {
  2. int i=0;
  3. int j=array[0].length-1;
  4. int n=array.length;
  5. while(i<n && j>=0){
  6. if(target==array[i][j])
  7. return true;
  8. else if(target>array[i][j])
  9. i++;
  10. else
  11. j--;
  12. }
  13. return false;
  14. }

源代码

  1. package com.quellanan.algorithm.day1;
  2. import java.util.Scanner;
  3. public class Solution {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. System.out.println("请输入行数");
  7. int n=scanner.nextInt();
  8. System.out.println("请输入列数");
  9. int m=scanner.nextInt();
  10. System.out.println("请输入二维数组");
  11. int[][] array=new int[n][m];
  12. for(int i=0;i<n;i++){
  13. for(int j=0;j<m;j++){
  14. array[i][j]=scanner.nextInt();
  15. System.out.print(array[i][j]+"\t");
  16. }
  17. System.out.println("");
  18. }
  19. System.out.println("请输入目标数字");
  20. int targer=scanner.nextInt();
  21. System.out.println(find(array,targer));
  22. }
  23. public static boolean find(int [][] array,int target) {
  24. int i=0;
  25. int j=array[0].length-1;
  26. int n=array.length;
  27. while(i<n && j>=0){
  28. if(target==array[i][j])
  29. return true;
  30. else if(target>array[i][j])
  31. i++;
  32. else
  33. j--;
  34. }
  35. return false;
  36. }
  37. }

运行结果

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,65人围观)

还没有评论,来说两句吧...

相关阅读

    相关 offer数组查找

    描述 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和

    相关 offer数组查找

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

    相关 offer数组查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个

    相关 offer数组查找

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