查找有序二维数组中的元素

给定一个已排序的二维数组array,在其中查找一个元素value

查找策略如下图:

(1)将value和数组的右上角的值比较,如果大于右上角的值,则移除数组的第一行。

(2)将value和数组的左下角的值比较,如果大于左下角的值,则移除数组的第一列。

(3)直到查找完毕,已经找不到符合(1)(2)的情况后,或者数组只剩下一个元素

(4)得到一个较小的二维数组,再遍历该数组即可。

           

/**
 * Created by wuchao on 17-3-29.
 */
import javax.swing.text.html.HTMLDocument;
import java.util.*;
public class test {
    public static int arr[][] = {{1,2,3,4},{5,6,7,8},{9,10,12,13},{14,15,16,17}};
    public static void main(String[] args) {

        System.out.println(find(arr,1));
    }
    public static boolean find(int[][] array,int value){
        if(array==null) return false;
        int m = array.length;//行
        int n = array[0].length;//列
        int[] right = {0,n-1};//右上角
        int[] left = {m-1,0};//左下角
        while(true){
            if(right[0]==left[0]&&right[1]==left[1]){
                if(array[right[0]][right[1]]==value){
                    return true;
                }else{
                    return false;
                }
            }
            if(array[right[0]][right[1]]<value){
                right[0]=right[0]+1;
            }else if(array[left[0]][left[1]]<value){
                left[1]=left[1]+1;
            }else{
                //跳法这里说明已经找完
                break;
            }
        }
        for(int i=right[0];i<=left[0];i++){
            for(int j=left[1];j<=right[1];j++){
                if(array[i][j]==value) return true;
            }
        }
        return false;
    }
}
时间: 2024-10-29 08:47:23

查找有序二维数组中的元素的相关文章

有序二维数组中的查找

一个二维数组,每一行按照从左到右递增,每一列按照从上到下递增,查找数组中是否存在某个数.如数组: 1  2  8    9 2  4  9   12 4  7  10  13 6  8  11  15 思路: 这道题有其特殊性,从右上角或者左下角开始查找的方向是确定的.这句话是说比如是查找7,我们从右上角开始,9大于7,则减少列下标,查找13的话就增加行下表,查找的方向是确定的,这样就容易实现了. public class Item03 { public static void main(Str

剑指offer_快速查找递增二维数组中是否存在目标

[编程题]二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 完整通过代码: public class ArrayFind { public static void main(String[] args){ int a[][]={{1,2,3},{4,5,6},{7,8,9}}; System.out.println(Find(a,7)); } public sta

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

一.在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 首先选取数组中右上角的数字.如果该数字等于要查找的的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围. 实现过程如下: 运行结果如下:

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

有序二维数组中搜索特定的数

关于二维有序数组中搜索,其题目如下: 给定一个矩阵,都是整数,每一行从左到右升序,每一列从上到下有序,例如下面的矩阵 [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 请用最快的时间找出特定的数,例如,输入3,存在这个数,输入15,不存在这个数. 实现如下的函数bool FindArray(int *pArray,int nWidth,int nheight,int nKey). 最笨的方法是逐个遍历进行比较,如果是这样,这题目就没什么意义

经典面试算法题:线性查找有序二维数组

从右上角开始搜索,当前的元素map[x][y]和要搜索的数n有如下可能: map[x][y]==n --> 返回truemap[x][y]>n   --> 向左移动map[x][y]<n   --> 向下移动 搜索过程例子: AC代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in);

去掉二维数组中某个元素重复的一维数组

$i = [0]; foreach($data as $key => &$value){ if(in_array($value['patient_id'],$i)){ unset($data[$key]); }else{ $i[] = $value['patient_id']; } }

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

二维数组中的查找 题目描述:在一个二维数组中,每个一维数组的长度相同,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:选取二维数组的右上角元素, 如果元素大于target(表示输入的那个整数),则删除整列: 如果元素小于target,则删除整行. 循环的条件:遍历完二维数组中的元素后,仍然找不到target值,循环停止.则,对于row行,从上0开始递增,执行for循环的条件是小于行的长度:

二维数组中的查找-牛客网-剑指offer

1.问题描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.问题分析 水平方向.垂直方向二重循环查找 3.源代码 package www.nowcoder.com.conquerOffer.array; /** * 二维数组中的查找 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整