热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

跟编程挑战赛干上了系列之容错处理的重要性

题目详情给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形。如下图所示,直方图中
题目详情

给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形。


如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5,6,2,3]:



那么上述直方图中,面积最大的矩形便是下图所示的阴影部分的面积,面积= 10单位。



请完成函数largestRectangleArea,实现寻找直方图中面积最大的矩形的功能,如当给定直方图各小块的高度= [2,1,5,6,2,3] ,返回10。


由于受到了CSDN上一篇介绍推特面试题的想法很容易找到了一个比较好的算法,且算法的复杂度为O(N)。

大概想法是这样的,要找到最大面积的矩形,首先要找到以每一个小块为起点(起点这个词可能不太准确,可继续往后看)对应的最大矩形面积,然后在这些候选最大矩形面积中找出最大值,即为所求直方图中的面积最大矩形。

第一步:如何找出以每一个小块为起点对应的最大矩形面积?

        以题目所给的用例为例来说明。

        如第一个小块的高度为2,第二个小块的高度为1,第二个小块高度小于第一个小块,所以第一个小块对应的最大矩形面积为2X1=2.

        如第二个小块的高度为1,第一个小块的高度为2大于第二个小块,第三、四、五、六个小块的高度也均大于第二个小块,所以第二个小块对应的最大矩形面积为1X6=6。

        接下来介绍一下计算每个小块对应最大矩形面积的算法,这就是我借鉴那道推特面试题的地方。

        首先按顺序从第一个小块开始从左至右前向遍历一遍数组,以第二个小块为例,每遇到右边小块高度大于它的高度时,其对应宽度加1。遇到高度比其低时,停止。

        接着按顺序以最后一个小块开始从右至左后向遍历一遍数组,以第二个小块为例,每遇到左边小块高度大于它的高度时,其对应宽度加1。遇到高度比其低时,停止。

        最后,依次将每个小块的高度和其宽度相乘,得到其对应的最大矩形面积。

第二步:就是在上面得到的候选最大矩形面积中找出最大的面积,作为函数的返回值就OK了。

下面是自己写的代码,虽然不够简洁,但是还是能够正常运行滴。

        

#include 

int largestRectangleArea(const int *height,int n) {
    int i,j;//定义两个循环变量
    int N=n;//这步多余了,完全没必要
    int temp;//零时中间变量
    int max1,max2;
    int* a=malloc(n*sizeof(int));//动态分配一个数组,用来存放每个小块对应的宽度
    for(i=0;i*(a+i+1))
         {
         temp=*(a+i+1);
         *(a+i+1)=*(a+i);
         *(a+i)=temp;
         }
      }
      max1=*(a+N-1);
      printf("%d\n",max1);
    for(i=0;i0;i--)
    {
        j=i;
        while(((*(height+i))<=(*(height+j-1)))&&(j>=0))
        {
            *(a+i)+=*(height+i);
            j--;
        }
     }
     printf("\n");
     for(i=0;i*(a+i+1))
         {
         temp=*(a+i+1);
         *(a+i+1)=*(a+i);
         *(a+i)=temp;
         }
      }
     
     max2=*(a+n-1);
     free(a);
     printf("\n%d",max2);
     return (max2>max1)?max2:max1;     
    }





//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    //
    int height[11]={100,6,6,6,6,3,6,6,6,6,6};
    printf("\n%d\n",largestRectangleArea(height,11));
    return 0;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
 
  
 
  
本以为已经可以拿到了十分的,结果坑在后面,而且掉进去了很久才知道是这个坑。
提交代码后提示执行用户样例失败,为什么呢?
首先我想到了是非负整数,我定义的是变量int型,可能计算出现问题,我换成unsigned int型依然没起来;
其次我想到了是计算溢出,于是我把int型改为long long int 够长吧,结果还是长跪不起。
最后的最后我又想了很多很多,包括是不是算法出问题了,我把我能想到的所有用例都试了一遍,长跪不起。
泼出去了,去网上搜了一下别人怎么解决的,其中有一个人的算法和我用的一样,链接为http://blog.csdn.net/SunnyYoona/article/details/16931047
最核心的区别就是在这
 
  
  1. if(height == NULL || n <= 0){
  2. return 0;  
  3. } 
加上这个坑爹的容错处理,提交本人的代码就成功了,只可惜来的太迟,10分飞了。
亲,写程序一定要记得考虑容错处理额。


 
  


推荐阅读
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 深入理解父组件与子组件的引用和访问
    本文详细介绍了如何在Vue.js中通过$children和$refs属性实现父组件对子组件的访问,并提供了具体的代码示例及最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • PyCharm中配置Pylint静态代码分析工具
    本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
author-avatar
个信2502857367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有