标签:leetcode 传递 错误 keep for 不能 printf turn 简单
今天做了LeetCode上的一道题,原理较简单,很容易相处解法,但是在编写代码过程中传递二维数组时总是会发生错误,因此总结了下如何传递:
参考博客 http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html
题目 :在二维数组grid
中,grid[i][j]
代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。
最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。
建筑物高度可以增加的最大总和是多少?
声明函数如:int maxIncreaseKeepingSkyline(int** grid){}
意在传递二维数组grid[4][4],如果进行调用maxIncreaseKeepingSkyline(grid或* grid[4] 或grid[] &grdi[0]); 等等格式都是错误的,根据不同编译器不同的设置,可能出现warning 或者error,
需要进行强制转换(int**)grid; 这样就ok了
maxIncreaseKeepingSkyline((int**)grid);
然后在maxIncreaseKeepingSkyline方法中访问grid[m][n]时 不能这样通过下标直接访问,需要通过编译器的方式访问 及 grid+n*i+j;在本题中访问方式为*((int*)grid +n*i+j))
源代码:本地调试通过,上传时测试用例错误,不知道为什么
#include<stdio.h>
//返回两个数中的最小数
int MaxNum(int a, int b) {
if (a >= b)
return b;
else
return a;
}
//分别找出二维数组中每行每列的最大值并存储在两个数组row和col中返回
void searchMaxHigher(int **grid, int row[], int col[], int gridRowSize, int *gridColSizes) {
int i, j;
//计算二维数组每行的最大值存储在row[]中
for (i = 0; i<gridRowSize; i++) {
row[i] = 0;
for (j = 0; j< (*gridColSizes); j++)
{
if (row[i]< (*((int *)grid+ (*gridColSizes)*i + j)))
row[i] = *((int *)grid + (*gridColSizes)*i + j);
}
}
//计算二维数组每行的最大值存储在col[]中
for (i = 0; i<(*gridColSizes); i++) {
col[i] = 0;
for (j = 0; j< gridRowSize; j++)
{
if (col[i]<(*((int *)grid + (*gridColSizes)*j + i)))
col[i] = (*((int *)grid + (*gridColSizes)*j + i));
}
}
}
//找出每个元素的增加数并累加
int maxIncreaseKeepingSkyline(int** grid, int gridRowSize, int *gridColSizes) {
int rowMax[50], colMax[50];
int i, j;
int sum = 0;
searchMaxHigher( grid, rowMax, colMax, gridRowSize, gridColSizes);
for (i = 0; i<gridRowSize; i++)
for (j = 0; j<(*gridColSizes); j++) {
if ((*((int *)grid + (*gridColSizes)*i + j)) <= rowMax[i] && (*((int*)grid + (*gridColSizes)*i + j)) <= colMax[j]) {
sum = sum + (MaxNum(rowMax[i], colMax[j]) - (*((int *)grid + (*gridColSizes)*i + j)));
}
}
return sum;
}
void main() {
int a[4][4] = { {3,0,8,4},{2,4,5,7},{9,2,6,3},{0,3,1,0} };
int ** grid;
int row = 4, col = 4;
int sum = 0;
sum=maxIncreaseKeepingSkyline((int **)a, row ,&col);
printf("%d\n", sum);
}
标签:leetcode 传递 错误 keep for 不能 printf turn 简单
原文地址:https://www.cnblogs.com/feifiefighting/p/9047972.html