zoukankan      html  css  js  c++  java
  • 牛客网&剑指offer 二维数组中的查找(JAVA)

    牛客网·剑指offer 二维数组中的查找(JAVA)

    题目描述

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

    解题思路

    解法一

    将每一行看成一个一维数组,手写二分排序查他。

    public class Solution {
        private static int BS(int fromIndex, int toIndex, int[] a, int num) {
            int low = fromIndex, high = toIndex-1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if(a[mid] < num) 
                    low = mid + 1;
                else if(a[mid] > num)
                    high = mid - 1;
                else 
                    return mid;
            }
            return -(low + 1);
        }
        public boolean Find(int target, int [][] array) {
            if(array == null) return false;
            boolean ans = false;
            for(int i = 0; i < array.length; i++) {
                if(array[i].length == 0 || array[i][0] > target) break; //万一此列为空
                if(BS(0, array[i].length, array[i], target) < 0) continue;
                else {
                    ans = true;
                    break;
                }
            }
            return ans;
        }
    }
    

    解法二

    前提:矩阵是有序的。

    从第i行看:

    • 若该行的最后一个数字小于所查询数字, 那么肯定不可能在该行,直接去下一行查找。
    • 若该行的最后一个数字等于所查询数字,那么返回true。
    • 若该行的最后一个数字大于所查询数字,那么必在该行,搜索即可。
    public class Solution {
        public boolean Find(int [][] array,int target) {
            boolean found = false;
            int lie = array[0].length; // 列长
            int hang = array.length;   // 行数
            int column = lie -1;	   // 从最后一列看起
            int row =0;				   // 从第一行看起
            while(row<hang &&column>=0){
               int value = array[row][column];
                if(target>value){
                    row++;
                }else if(value>target){
                    column--;
                }else{
                    found = true;
                    break;
                }
            }
                return found;
    	}
    }
    

    解法3

    解法二中引入快排

    public class Solution {
        private static int BS(int fromIndex, int toIndex, int[] a, int num) {
            int low = fromIndex, high = toIndex-1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if(a[mid] < num)
                    low = mid + 1;
                else if(a[mid] > num)
                    high = mid - 1;
                else
                    return mid;
            }
            return -(low + 1);
        }
        public boolean Find(int target, int [][] array) {
            boolean ans = false;
            for(int i = 0; i < array.length; i++) {
                if(array[i].length == 0) break;
                int value = array[i][array[i].length-1];
                if(value < target)
                    continue;
                else if (value > target) {
                    if(BS(0, array[i].length, array[i], target) >= 0)
                        ans = true;
                } else {
                    ans = true;
                    break;
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    数据库连接池实现
    Linux array_vpnc
    MVC小结
    Linux和Windows下 classpath 的差异
    无法删除DLL文件解决方法(转)
    电信工程管理方法
    常用设计思想
    MAX262使用说明
    基于FPGA的FIR滤波器(草稿)
    数字存储示波器(草稿)
  • 原文地址:https://www.cnblogs.com/fromneptune/p/12346162.html
Copyright © 2011-2022 走看看