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;
}

 

      

      

猜你喜欢

转载自blog.csdn.net/weixin_44140250/article/details/85604836
今日推荐