- 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 思路:一般思维从左上往右下一直找会遇到困难,因为向右和向下都是比自己大的,该往哪个方向走呢??最好的方法是从右上角开始走,找到就退出,比它大就向下走,比它小就往左走。。或者,从左下角开始走也行,总之保证它能走的方向只有一个。
- 代码:
#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行的声明)
浙公网安备 33010602011771号