• 力扣最热一百题——盛水最多的容器


    终于又来了。我的算法记录的文章已经很久没有更新了。为什么呢?

    这段时间都在更新有关python的文章,有对python感兴趣的朋友可以在主页找到。

    但是这也并不是主要的原因

    在10月5号我发布了我的第一篇博客,大家也可以看见我的每一篇算法博客的开头都是吾日三省吾身,比那个男人帅吗?比那个男人爱她吗?比那个男人有实力吗?也可以在我的文章中的比如代码注释,结语感想看见一些emo 的句子

    在之后的文章不会出现了。因为我已经彻底的失去了所爱的那个她,彻底失去。她的言语刺痛了我,剥夺了我的爱。

    但是,流程该走还是要走,那就进入新的流程吧!

    一身正气报国家,旁无乱境不恋她

    ヾ(◍°∇°◍)ノ゙


    力扣题号:11. 盛最多水的容器 - 力扣(LeetCode)

    下述题目描述和示例均来自力扣

    题目描述

    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

    找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    返回容器可以储存的最大水量。

    说明:你不能倾斜容器。

     示例

    示例 1:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49 
    解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    示例 2:

    输入:height = [1,1]
    输出:1
    

    提示:

    • n == height.length
    • 2 <= n <= 105
    • 0 <= height[i] <= 104

     


    回归文章第一弹就不搞这些虚的了。直接上嘴脸!

    思路

    其实就是要找到这里面,两个柱子包起来里面的最大的面积对吧。

    第一种思路就是直接暴力for循环,把每一个都找一遍,然后返回最大的那一个。我在这里就不演示暴力的解法了,盲猜跑不出来(反正我没试过♪(^∇^*))。

    然后就是第二章思路,在数组里面优化是不是第一时间想到的就是双指针呐(*^▽^*)!对喽~~

    我们直接定义左右指针,然后精华是什么呢?什么时候移动指针呢?

    答:

    在每一次判断的时候,那个指针所对应的高度低,就移动谁,left是++,right是--,你想嘛。这里装水的高度根据木桶效应是取决于最低的那一个的,如果你移动的是更低的那一个,那么即使右更高的,也没有用,而且底边长还会更低,对吧,那就是这个思路,代码如下:

     Java解法没有之一:双指针

    详细的代码注释也有

    1. class Solution {
    2. public int maxArea(int[] height) {
    3. // 利用双指针
    4. int left = 0;
    5. int right = height.length - 1;
    6. // 开始循环判断
    7. // 在这里的时候,left == right是没有用的,所以直接 < 即可
    8. int result = 0;
    9. while (left < right) {
    10. // 底边长度为right - left
    11. int b_len = right - left;
    12. // 高度是他们之间最小的那一个
    13. // 这里每次固定移动高度较低的那一边
    14. int h_len = height[left] < height[right] ? height[left++] : height[right--];
    15. // 获取面积
    16. int area = b_len * h_len;
    17. // 大于result就刷新值
    18. if (area > result) {
    19. result = b_len * h_len;
    20. }
    21. }
    22. return result;
    23. }
    24. }

     

    就是快


    因为很多同学也是使用C++,和Python的,所以我今后也同时提供C++和python的语法

    C++解法没有之一:双指针

    1. class Solution {
    2. public:
    3. int maxArea(vector<int>& height) {
    4. int left = 0;
    5. int right = height.size()- 1;
    6. int result = 0;
    7. while(left < right){
    8. int b_len = right - left;
    9. int h_len = height[left] < height[right] ? height[left++] : height[right--];
    10. int area = b_len * h_len;
    11. if(area > result){
    12. result = area;
    13. }
    14. }
    15. return result;
    16. }
    17. };

    ??????????????????????????????????????????????????????????????????????????????????????????????????

    我没看错吧,C++要花60ms,Java只需要2ms,wdf?


    Python解法之没有之一:双指针

    1. class Solution:
    2. def maxArea(self, height: List[int]) -> int:
    3. left = 0
    4. right = len(height) - 1
    5. result = 0
    6. while left < right:
    7. b_len = right - left
    8. h_len = height[left] if height[left] < height[right] else height[right]
    9. if height[left] < height[right]:
    10. left += 1
    11. else:
    12. right -= 1
    13. area = b_len * h_len
    14. if area > result:
    15. result = area
    16. return result

    怎么说捏,python更慢我是理解的,C++比Java慢那么多我不理解 


    结语

    咋说捏~!~

    C++和Java用同一个方法

    C++比Java慢,emmmmmmmmmmmmmmmmmmmmmmmmmmmm

    不理解

    那我直接得出结论

    Java是这个世界上最好的语言~!!!!!!!!!!!

    再见┏(^0^)┛

  • 相关阅读:
    格式化名称节点,启动Hadoop
    3种方案扩展RestTemplate让其具备负载均衡(超级详细)「扩展点实战系列」- 第442篇
    微生物学检验试剂——博迈伦
    Spring Start制作
    Python 的基本数据类型
    软件测试 —— 移动端测试
    【Linux】信号量和线程池
    解决Microsoft已经阻止宏运行,因为此文件的来源不受信任。
    远程桌面控制组件封装使用的microsoft terminal services active 1.0
    PHP自增构造_GET
  • 原文地址:https://blog.csdn.net/DDDDWJDDDD/article/details/134273293