俊介三

一天更新一点,一天积累一点

导航

二维数组中的查找

Posted on 2013-04-03 13:30  俊介三在前进  阅读(191)  评论(0)    收藏  举报
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:一般思维从左上往右下一直找会遇到困难,因为向右和向下都是比自己大的,该往哪个方向走呢??最好的方法是从右上角开始走,找到就退出,比它大就向下走,比它小就往左走。。或者,从左下角开始走也行,总之保证它能走的方向只有一个。
代码:
#include <iostream>
#include <stdio.h>
using namespace std;

bool helper(int* A, int m, int n, int k){
    int i = 0;
    int j = n-1;
    while(i<=m-1 && j>=0){
                //take care
        if(*(A+i*n+j) == k) return true;
        else if(*(A+i*n+j) > k) j--;
        else i++;
    }
    return false;
}

int arr[1005][1005];
int main(){
    
    int m,n,k;
    int i,j;
    while(scanf("%d %d",&m,&n)!=EOF){
        int arr[m][n];
        scanf("%d",&k);
        for(i=0;i<m;i++){
            for(j=0;j<n;j++){
                scanf("%d",&arr[i][j]);
            }
        }
        
                //take care!
        bool ans = helper((int *)arr,m,n,k);
        printf("%s\n",ans?"Yes":"No");
    }
    return 0;
}

 

从这题找到我知识遗忘的地方:

1.二维数组作为参数传给函数(为啥要另开一个函数而不直接在main里做呢?主要考虑到多层循环时,如果要避免goto这种东西,最好写一个函数,某个条件目的达到马上return,而不用考虑跳出的是哪层for哪层while,使用标志位flag来判断等等)的操作不太熟悉。
这样声明 int arr[1005][1005];(需要较大空间时放在main函数外,作为全局变量更好)这样调用函数  func((int*)arr);(无论多少维,函数名永远是数组第一个元素的地址的常量,调用时把它强制转成一维的)
函数中这样访问arr[i][j]  *(arr+i*n+j)=1;  (注意:n为你声明数组的列数,是变量的话就跟放它就好,是常量如1005,一定别忘了换成1005。如上面2行的声明)