zoukankan      html  css  js  c++  java
  • 二维数组中的查找

    题目描述

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
    /* 思路
    * 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,
    * 因此从左下角开始查找,当要查找数字比左下角数字大时。右移
    * 要查找数字比左下角数字小时,上移
    */
     
     
    class Solution {
    public:
        bool Find(int target, vector<vector<int> > array) {
            int row=array.size();
            int col=array[0].size();
            int i,j;
           	for(i=row-1,j=0;i>=0&&j<col;) {
                if(target==array[i][j]) return 1;
                if(target<array[i][j]) {
                    i--;
                    continue;
                }
                if(target > array[i][j]) {
                    j++;
                    continue;
                }
            }
            
            return 0;
        }
    };
    

      

    还有其他思路。

    一种是:
    把每一行看成有序递增的数组,
    利用二分查找,
    通过遍历每一行得到答案,
    时间复杂度是nlogn
    public class Solution {
        public boolean Find(int [][] array,int target) {
             
            for(int i=0;i<array.length;i++){
                int low=0;
                int high=array[i].length-1;
                while(low<=high){
                    int mid=(low+high)/2;
                    if(target>array[i][mid])
                        low=mid+1;
                    else if(target<array[i][mid])
                        high=mid-1;
                    else
                        return true;
                }
            }
            return false;
     
        }
    }
     
    另外一种思路是:
    利用二维数组由上到下,由左到右递增的规律,
    那么选取右上角或者左下角的元素a[row][col]与target进行比较,
    当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
    即col--;
    当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
    即row++;
    public class Solution {
        public boolean Find(int [][] array,int target) {
            int row=0;
            int col=array[0].length-1;
            while(row<=array.length-1&&col>=0){
                if(target==array[row][col])
                    return true;
                else if(target>array[row][col])
                    row++;
                else
                    col--;
            }
            return false;
     
        }
    }
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    京东二面面经(07.17 11:30)
    招银三面手撕代码题(字符串连续子串)
    shein二面(31min)
    京东提前批一面
    两个链表的第一个公共结点
    Java并发机制的底层实现原理
    招银网络(二面07.09)
    黑盒测试与白盒测试
    求1+2+...+n(剑指offer-47)
    第一个只出现一次的字符(剑指offer-34)
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7272207.html
Copyright © 2011-2022 走看看