跟程式設計挑戰賽幹上了系列之容錯處理的重要性

2021-06-20 04:00:16 字數 2044 閱讀 2010

題目詳情

給定直方圖,每一小塊的height由n個非負整數所確定,每一小塊的width都為1,請找出直方圖中面積最大的矩形。

如下圖所示,直方圖中每一塊的寬度都是1,每一塊給定的高度分別是[2,1,5,6,2,3]:

那麼上述直方圖中,面積最大的矩形便是下圖所示的陰影部分的面積,面積= 10單位。

請完成函式largestrectanglearea,實現尋找直方圖中面積最大的矩形的功能,如當給定直方圖各小塊的高度= [2,1,5,6,2,3] ,返回10。

大概想法是這樣的,要找到最大面積的矩形,首先要找到以每乙個小塊為起點(起點這個詞可能不太準確,可繼續往後看)對應的最大矩形面積,然後在這些候選最大矩形面積中找出最大值,即為所求直方圖中的面積最大矩形。

第一步:如何找出以每乙個小塊為起點對應的最大矩形面積?

以題目所給的用例為例來說明。

如第乙個小塊的高度為2,第二個小塊的高度為1,第二個小塊高度小於第乙個小塊,所以第乙個小塊對應的最大矩形面積為2x1=2.

如第二個小塊的高度為1,第乙個小塊的高度為2大於第二個小塊,第

三、四、五、六個小塊的高度也均大於第二個小塊,所以第二個小塊對應的最大矩形面積為1x6=6。

接下來介紹一下計算每個小塊對應最大矩形面積的演算法,這就是我借鑑那道推特面試題的地方。

首先按順序從第乙個小塊開始從左至右前向遍歷一遍陣列,以第二個小塊為例,每遇到右邊小塊高度大於它的高度時,其對應寬度加1。遇到高度比其低時,停止。

接著按順序以最後乙個小塊開始從右至左後向遍歷一遍陣列,以第二個小塊為例,每遇到左邊小塊高度大於它的高度時,其對應寬度加1。遇到高度比其低時,停止。

最後,依次將每個小塊的高度和其寬度相乘,得到其對應的最大矩形面積。

第二步:就是在上面得到的候選最大矩形面積中找出最大的面積,作為函式的返回值就ok了。

下面是自己寫的**,雖然不夠簡潔,但是還是能夠正常執行滴。

#include int largestrectanglearea(const int *height,int n) 

}max1=*(a+n-1);

printf("%d\n",max1);

for(i=0;i0;i--)

}printf("\n");

for(i=0;i*(a+i+1))

}max2=*(a+n-1);

free(a);

printf("\n%d",max2);

return (max2>max1)?max2:max1;

}int main()

; printf("\n%d\n",largestrectanglearea(height,11));

return 0;

}

本以為已經可以拿到了十分的,結果坑在後面,而且掉進去了很久才知道是這個坑。
提交**後提示執行使用者樣例失敗,為什麼呢?
首先我想到了是非負整數,我定義的是變數int型,可能計算出現問題,我換成unsigned int型依然沒起來;
其次我想到了是計算溢位,於是我把int型改為long long int 夠長吧,結果還是長跪不起。
最後的最後我又想了很多很多,包括是不是演算法出問題了,我把我能想到的所有用例都試了一遍,長跪不起。
潑出去了,去網上搜了一下別人怎麼解決的,其中有乙個人的演算法和我用的一樣,鏈結為
最核心的區別就是在這
if(height == null || n <= 0)

加上這個坑爹的容錯處理,提交本人的**就成功了,只可惜來的太遲,10分飛了。

親,寫程式一定要記得考慮容錯處理額。

Gazebo燒腦系列 挑戰賽

假期終於到了。對於許多人來說,這意味著下班後可以吃點東西,玩遊戲和家人一起閒逛以及從事個人專案。如果想在這個假期裡找到一些有趣的事情,提高ros技能,甚至可能賺到幾美元,那麼使用ros的比賽現在很多。最好的部分是,無需訂購大量零件或在組裝機械人的工作台上花費數小時,就可以在gazebo中進行所有操作...

2013程式設計之美挑戰賽 集會

description 在一條河的一側,分布著 n 個村莊。這些村莊平日裡需要一些 往來,然而商人們來回走遍每一座村莊是非常辛苦的,於是他們決定每個月都在河邊舉行一次集會,大家都來集會上購買需要的物品。然而在集會地點的選擇上,大家卻有分歧,因為誰都不願意集會的地點離自己村莊非常遠。經過一番激烈的討論...

傳話遊戲 程式設計之美挑戰賽

題目描述 時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb alice和bob還有其他幾位好朋友在一起玩傳話遊戲。這個遊戲是這樣進行的 首先,所有遊戲者按順序站成一排,alice站第一位,bob站最後一位。然後,alice想一句話悄悄告訴第二位遊戲者,第二位遊戲者又悄悄地告訴第...