• 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。


    一、题目描述

      在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
     
    二、思路解析
      此问题使用类似于二分查找的算法。右上角元素(第一行最后一列)的元素是第一行元素与最后一列元素构成的递增序列的分割点,因为此元素的左面元素都比此元素小,此元素的下面元素都比此元素大(类似于二分查找中的中点位置的元素)。所以每次循环,比较目标元素target与右上角元素的大小关系,如果相等,则找到,返会true即可。如果target元素大于右上角元素,则target大于当前第一行所有元素,所以target不能出现在第一行,所以需要把第一行清除。如果target元素小于右上角元素,则target小于最后一列所有元素,不可能出现在最后一列,所以需要把最后一列清除。清除第一行或者最后一列之后,继续采用上述方法,用右上角元素与target元素进行比较。如果当列数减小到零或者行数增加到最后一行都没有找到target,则返回false,说明此二维数组中没有与target相同的元素
     
    三、Java代码
      

    public class Solution {
    public boolean Find(int target, int [][] array) {
    int rows = array.length;//获得初始行数
    int cols = array[0].length;//获得初始的列数


    boolean flag = false;//设置标志位为false
    int row = 0;//动态行数默认从0开始
    int col = cols-1;//动态列数默认从最后一列开始


    while(row<=rows-1 && col>=0){//当没有达到最后一行并且没有达到第一列的时候
    if(array[row][col] == target){//如果对象元素等于target,找到,break
    flag = true;
    break;
    }else if(array[row][col] < target){
    row++;
    }else{
    col--;
    }
    }
    return flag;
    }
    }

    以上均为个人理解,如果不正确、不合理或者可以优化的地方,欢迎下方留言。 

  • 相关阅读:
    一个丰富的通知工具类 --第三方开源--NotifyUtil
    RecycleView出现折叠效果--第三方开源--SectionedExpandableGridRecyclerView
    Socket TCP连接相互通信
    InputStream与String,Byte之间互转
    socket调试工具
    可直接导入studio的 android-Ultra-Pull-To-Refresh-master
    纯手写验证码MVC中
    Upload图片-单张
    C#、SQL中的事务
    MVC、控件、一般处理程序中的session and cookie
  • 原文地址:https://www.cnblogs.com/xwwbb/p/10732247.html
Copyright © 2020-2023  润新知