2011-09-25 84 views
5

在白天,一隻蝸牛爬上了牆壁。經過一整天的勞動,它停下來休息了一段時間......但睡着了!第二天早上醒來,發現它在睡覺時滑下了。爲我的作業優化的解決方案

如果每天都發生這種情況,蝸牛會爬上多少次以覆蓋不同高度的n個牆壁?

我寫了一個函數來計算蝸牛的野怪的數量,如下圖所示:

void count(int move_forward, int move_backward, int number_walls, int[] height) 
    { 
     int count = number_walls, diff = move_forward - move_backward; 
     while (number_walls--) 
      for (move_backward = move_forward; move_backward < height[number_walls]; move_backward += diff) 
       count++; 
    } 

它的正常工作。但我想知道是否有任何其他解決此問題的方法來進一步優化程序的速度。

+3

(height-x)/(x-y)+1,不需要循環 – amit

+2

@Jay,BTW - 在早期問題中使用有意義的變量名稱的建議在內部循環的上下文中是有爭議的。太多太長的名稱會讓你的代碼像一堆神祕的單名和雙名字一樣無法讀取。這完全取決於平衡。 – dmckee

+1

只要我堅持我的鼻子,還有一點意見。這個練習的要點可能是向你展示一下,坐下來想一會兒,你可以從「O(高度)」(方法你嘗試它)到'O(1)'(amit解決它的方式)。 – dmckee

回答

7

解決方案是((height-x)/(x-y))+1,不需要循環。

蝸牛需要爬到:height-x,需要他((height-x)/(x-y))天。一旦它在那裏,他需要額外的一天才能爬上剩餘的x。

編輯:在評論中提到,這種解決方案解決了每面牆的問題,您需要遍歷您heights陣列,並且總結了這些結果,您節省至少內部循環,使IT運(n),而不是O(n * h),其中n是牆的數量,h是牆的高度。

(*)注意:您可能希望保存每個牆的提醒[即在他穿過這堵牆之後蝸牛可以繼續走下去多少],並從下一堵牆中扣除它,依賴於任務描述......如果蝸牛每天最多可以通過一面牆,則忽略最後一條評論。

+0

下垂者會詳細說明嗎? – amit

+2

我不是downvoter,但我想這是因爲height是一組值。您仍然需要一個循環來獲取總高度或將解決方案應用於每個高度。 – tinman

+0

@tinman:你說得對,這個答案顯示瞭如何做一個單一的牆,我會明確提到它。感謝您的評論。 – amit