1. 程式人生 > >11. Container With Most Water ——O(n²)

11. Container With Most Water ——O(n²)

不能再懶惰了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;
}