11. Container With Most Water ——O(n²)
阿新 • • 發佈:2019-01-02
不能再懶惰了orz
思路
emmm小學奧數題的感覺,希望以後可以適應好這樣的題目。5分鐘才想出來,思維比較慢,希望以後有快速思考和程式設計的能力。
面試題或者說實際生產的程式演算法設計,需要的是人為簡化,就像給孩子鋪路一樣,能幫的事情都給幫了。這裡面最有用的簡化是複雜度的簡化,目前比較理解的是對於迴圈的縮減。其次可以縮減一些較為明顯的步驟,比如判斷句這樣的,判斷一次可以少執行很多次語句,對於複雜度可能沒什麼大影響,但終歸是節省了計算量。
秉承著這樣的想法,我考慮到了這樣幾個關鍵點:
1. 拒絕大模擬,但遍歷是必須的
2. 減少遍歷只能從規律入手
3. 規律:“末項距首項最遠”--核心。從首項開始從左向右遍歷(每次遍歷的起始項加一),每次遍歷的末項只要比首項大,則此面積必最大。若非,則需在此次遍歷中再從後向前遍歷,比較面積(可以只判斷高度比末項大的項)。
技術回顧
都忘乾淨了……
vector
操作上類似於動態可變長的陣列,(本質區別在於執行和儲存的方式)。primer的作者說,“在實際的程式設計中,我們作為程式設計師應該避免用到低階陣列和指標,而更應該多用高階的vector和迭代器。”
這裡需要用到的有
vector<資料型別> 名稱
名稱.push_back :存入
名稱.size():長度
名稱 [ i ]:取數
三目運算子
a>b ? 左 :右
角標運算
間隔:兩腳標作差即可。
倒數第n個數:N-n. 如:最後一個是[N-1],倒數第三個是[N-3]。
第n個數:n-1。
移動n個數(n次):+ - n 。
陣列置空
int array[number] = { }; // int型別表現形式是 0 。
慢速程式碼獻上
#include <iostream> #include <vector> using namespace std; class Solution { public: int maxArea(vector<int> &height) { int area = 0; int number = height.size(); int archive[number] = {}; for (int i = 0; i < number - 1; i++) { if (height[number - 1] >= height[i]) { archive[i] = (number - 1 - i) * height[i]; } else { int temp = height[number - 1]; int temparea = temp * (number - 1 - i); for (int k = 0; k < number - 1 - i; k++) { if (height[number - 1 - k] <= temp) continue; else { int heightplus=height[i]<height[number - 1 - k]? height[i]:height[number - 1 - k]; if (temparea > heightplus * (number - 1 - k-i)) continue; else { temp = height[number - 1 - k]; temparea = heightplus * (number - 1 - k-i); } } } archive[i] = temparea; } } for (int i = 0; i < number - 1; i++){ cout<<archive[i]<<" "; area = archive[i] > area ? archive[i] : area; } return area; } }; int main() { int backup[9] = {1,8,6,2,5,4,8,3,1}; vector<int> height; for (int i = 0; i < 9; i++) height.push_back(backup[i]); Solution s; int area = s.maxArea(height); cout <<area << endl; system("pause"); return 0; }