ACM_二维数组的查找

二维数组的查找

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

给定一个n*m的二维数组,保证a[i][j] < a[i+1][j],a[i][j]< a[i][j+1](其中0≤i< n-1,0≤j< m-1);
接下来有q个询问,每个询问包含一个数字num,查找num是否包含在该二维数组里面。

Input:

输入包含多组测试数据,对于每组数据,首先输入两个整数n,m,(1≤n,m≤1000).接下来输入n*m个数a[i][j](0≤a[i][j]≤10^9);接下来有q(1≤q≤1000)个询问每个询问包含一个数字num。

Output:

对于每组数据,对于每个询问如果num在二维数组里,输出Yes,否则输出No。

Sample Input:

4 3
1 2 8
2 4 9
4 7 10
6 8 11
3
5
4
10

Sample Output:

No
Yes
Yes解题思路:二维数组的查找,题目中给出的矩阵最大为10^3*10^3,暴力查找显然会超时。但解题的关键在于标红色的条件,即每一行是升序,每一列也是升序,所以根据这个特点,查找的起始点应从右上角开始,向左边和下边进行扫描比较,这样可以节省很多时间。①显然当a[i][j]>num时,说明当前行num可能在当前行,于是j--向左扫描;②当a[i][j]<num时,说明当前行所在列的值比较小,于是i++进入下一行进行比较,③最后相等时,只需做一个标记看是否矩阵中存在这个元素即可。这里可能对②这种情况会有疑问,我们简单拿3*3矩阵举个栗子:3   6 -- 11  |4   7    12  |5   8    13如果我们要查找元素9是否在矩阵中,首先11>9,于是--j,然后6<9,于是++i,解决疑问就在这里,因为11所在列是升序,即11<12,所以当num>a[i][j](9>6)++i之后,即现在第二行所在列(比如:12)之后肯定比num大,所以不用去比较剩下的列元素。当9与8比较完之后,由于9>8,所以++i导致越界,于是退出循环,表示矩阵中没有9这个元素。AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[1005][1005],n,m,q,num;bool flag;//标记是否找到
 4 int main()
 5 {
 6     while(cin>>n>>m){
 7         for(int i=0;i<n;++i)
 8             for(int j=0;j<m;++j)
 9                 cin>>a[i][j];
10         cin>>q;
11         while(q--){
12             cin>>num;flag=false;
13             for(int i=0,j=m-1;!flag && i<n && j>=0;){
14                 if(a[i][j]==num)flag=true;
15                 else if(a[i][j]<num)++i;
16                 else --j;
17             }
18             if(flag)cout<<"Yes"<<endl;
19             else cout<<"No"<<endl;
20         }
21     }
22     return 0;
23 }
 

原文地址:https://www.cnblogs.com/acgoto/p/9031435.html

时间: 2024-10-31 22:43:57

ACM_二维数组的查找的相关文章

剑指offer:二维数组的查找

题目:二维数组的查找 思路: 由于二维数组是从左到右,从上到下是递增的,所以可以从右上角或者左下角开始选择, 比如从右上角开始, 右上角的值都比目标值大的话,而右上角所在列的值都比右上角的值大,则所在列排除. 右上角的值都比目标值小的话,而右上角所在行的值都比右上角的值小,则所在行排除. 以此类推,查找会以行或者列的范围进行缩小.直到得到与目标值相同的值或者没有相同值. 图解: 而右上角所在列的值都比目标值大,则排除所在列. 有 图解: 代码: class Solution { public b

在一个每一行从左到右递增每一列从上到下递增的二维数组中查找一个整数是否存在——3

给定一个二维数组,数组的特点是:每一行从左到右数据大小依次递增,每一列数据从上到下依次递增,要求判断一个整数是否在这个二维数组中: 设计二维数组如下: 首先,毋庸置疑的的是,遍历一遍数组肯定能判断出来,这也是最笨的方法了,因此,要想提高程序的运行效率就得找出一种高效的方法来查找: 一开始的想法大概都能想到从数组第一行第一列的数开始沿着对角线判断,如果是对角线数据就可以直接返回,比如我们要想查找17这个数,这时候17比0.9.16都要大,因此以0.9.16为对角线的矩形数据就可以排除了,接下来判断

每日一题10:在排序的二维数组中查找

排序的二维数组是这样的:在每一行中元素是递增的,在每一列中元素也是递增的,比如: 11 34 35 47 51 13 37 40 52 61 19 42 50 79 80 给定一个值,判断其是否在这样排序的二维数组中. 首先,先来生成测试数据,思路如下:1)先选择一种将给定输入按升序排列.2)构造一个二维数组,寻找该数组中以第一个元素为起点,确定一个最大的正方形区域(其宽要么与原数组的行或与原数组的列数相同).3)按规则,在这个正方形中,每个对角线元素都不小于从数组起点到这个元素所构成的正方形区

【C/C++学院】(3)二维数组/二分查找法/指针/模块注射

1.二维数组 二维数组可以当做一个一维数组, 每一个元素又是一个一维数组. #include <stdio.h> #include <stdlib.h> void main() { int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d,%d,%d,%x,%x &

二维数组的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如:下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,则由于数组不含该数字,返回false. 假如现在要判断在这个二维矩阵中是否包含数字7,则查找步骤如下所示:     (a) 9>7,下次在9的左侧查找:  (b) 8>7,下次在8的左侧查找:     (c) 2<

特殊二维数组的查找

题目:在一个二维数组的中,每一行都按照从左到右的递增顺序排列,每一列都按照从上到下的递增序列排序,请设计一个函数,输入这样的一个二维数组和一个整数,查询在此二维数组中是否存在此整数. example:在下列数组中 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 查询是否有7存在,存在返回true,否则返回false(显然应该返回true) 查询是否有5存在,存在返回true,否则返回false(显然应该返回false) 这么简单?耿直的我立马就想到了暴力算法,一个一个比

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

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

面试题1: 二维数组中查找

本题出自<剑指offer 名企面试官精讲典型编程题>面试题3. 题目3:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序.请完成一个函数,输入一个这样的二维数组和整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行每列递增排序.如果在数组中查询7,则返回true:如果查找数字14,由于数组中不包含14,则返回false. 解决方法分析: 首先我们选取二维数组左下角的数字8,由于8大于7,并且8还是第四行的第一个数,因此数字7不可能出现在8所在的行,

顺序二维数组的查找

1.题目 就是给定一个二维数组,数组里面从左到右,从上到下都是非降序.然后查找某个值是否存在.这个题目在剑指offer里面也有.不过这里用的是自己想出来的方法. 2.解法 这里涉及到二分查找肯定是想着使用二分查找.类比一维数组的二分查找,需要两个指针表示范围.但是这里是二维数组,所有想着使用四个指针表示范围.二分查找中肯定需要个中点,这个中心点自然而然选择矩形的中心点.在一维数组,中心点把数组分成了两个部分.这里在二维数组中,可以看作中心点把矩形分成了四个小矩形.那么如何进行二分查找呢? 这里如