【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字

这篇具有很好参考价值的文章主要介绍了【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法
【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法
盛水最多的容器

(1)暴力解法

  算法思路:我们枚举出所有的容器大小,取最大值即可。

  容器容积的计算方式:

  设两指针 i , j ,分别指向水槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于容器的高度由两板中的较短的板决定,因此可得容积公式 :
v = (j - i) * min( height[i] , height[j] );

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n=height.size();
        int ret=0;
        //枚举出所有的容器大小
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                //计算当前的容器容量
                int v=(j-i)*(min(height[i],height[j]));
                ret=max(ret,v);//取最大容量的容器
            }
        }
        return ret;
    }
};

【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法

  当然由于两次遍历数组,所以时间复杂度为O(N2),会超时。


(2)对撞指针

  算法思路:我们设置两个指针left、right分别指向容器的两个端点(因为这里的是数组,数组在内存中的储存是连续的,而且数组是通过它们的下表访问,所有我们可以把数组下标看成是指针进行操作)不断修改左右的端点来获得容器的最大容量。

  容器的左边界为 height[left] ,右边界为 height[right] 。

  我们假设「左边边界」小于「右边边界」。

  水的容积会有如下变化形式:

  首先容器的宽度⼀定变小。由于左边界较小,决定了水的高度。如果改变左边界,新的水面高度不确定,但是⼀定不会超过右边的柱子高度,因此容器的容积可能会增大或者减小。

  但是如果改变右边界,无论右边界移动到哪⾥,新的水面的高度⼀定不会超过左边界,也就是现在左边界的所在的水面高度,但是由于容器的宽度减小,因此容器的容积一定会变小。

  综上,我们不断选取左右两个边界中的较大边界,以保留当下的最有解,不断的 left++ 或right–,直到left和right相遇。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0;
        int right=height.size()-1;
        int ret=0;
        //循环条件为右边界大于左边界
        while(left<right)
        {
            //计算当前容器的容量
            int v=(right-left)*(min(height[left],height[right]));
            ret=max(v,ret);//不断更新容器的最大容量
            if(height[left]>height[right]) right--;//不断更新左右高度
            else left++;                           //保留高的,舍弃较矮的高
        }
        return ret;
    }
};

时间复杂度:O(N)
【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法


【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法

和为s的两个数字

  和两数之和不同的是,该数组中的元素是有序的,而且使用暴力解法会超时。

(1)对撞指针

这里有三种情况:

  当 nums[left] + nums[right] == target时,说明找到结果,记录结果,并且返回;

  当 nums[left] + nums[right] < target 时,此时 nums[right] 相当于是 nums[left] 能碰到的最大值。如果此时不符合要求,说明我们需要增加这两个数之和,所以我们让left++,再取更大的数,以来靠近我们的目标和。

  当 nums[left] + nums[right] > target 时,说明我们所取的两数较大,所以我们应该减小这两个数之和,让right–,以此使得两数的总和变小,以此来靠近我们的目标和。不断比较下⼀组数据,直至两数和和目标和相等。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        while(left<right)
        {
            //如果两数和等于目标值,直接返回
            if(nums[left]+nums[right]==target)
            {
                return {nums[left],nums[right]};
            }//如果两数和大于目标值,right--
            else if(nums[left]+nums[right]>target)
            {
                right--;
            }//如果两数和小于目标值,left++    
            else
            {
                left++;
            }
        }
        //照顾编译器,返回一个不存在的数组
        return {-1141514};
    }
};

时间复杂度:O(N)
【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字,算法,算法文章来源地址https://www.toymoban.com/news/detail-641949.html

到了这里,关于【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法专题突破】双指针 - 盛最多水的容器(4)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:11. 盛最多水的容器 - 力扣(Leetcode)   这道题目也不难理解, 两边的柱子的盛水量是根据短的那边的柱子决定的, 而盛水量就是短的柱子的高度 * 宽度即可。  这道题可以用暴力枚举,两层for循环,肯定是可

    2024年02月10日
    浏览(28)
  • 【优选算法】双指针 -- 快乐数 和 盛最多水的容器

    前言: 🎯个人博客:Dream_Chaser 🎈刷题专栏:优选算法篇 📚本篇内容:03快乐数 和 04盛最多水的容器 目录 一、快乐数(medium) 1. 题⽬链接:202. 快乐数 2. 题⽬描述: 3. 题⽬分析: 4.算法原理 二、盛最多水的容器 1. 题⽬链接:11.盛最多水的容器 - 力扣(LeetCode) 2. 题⽬描述

    2024年04月17日
    浏览(25)
  • 【算法挨揍日记】day02——双指针算法_快乐数、盛最多水的容器

    202. 快乐数 https://leetcode.cn/problems/happy-number/ 编写一个算法来判断一个数  n  是不是快乐数。 「快乐数」  定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是  无限循环  但始终变不到 1。 如果这

    2024年02月11日
    浏览(27)
  • 【算法专题--双指针算法】leecode-202. 快乐数(medium)、leecode-11. 盛最多水的容器(medium)

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 双指针 常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。 对撞指针:一般用于顺序结构中

    2024年03月23日
    浏览(29)
  • leetcode 11. 盛最多水的容器

    leetcode 11. 盛最多水的容器 解题思路 :双指针 每次向内移动矮的指针,因为如果向内移动高的指针,面积一定会变小;如果向内移动矮的指针,面积还有可能变大。

    2024年02月06日
    浏览(34)
  • LeetCode_11. 盛最多水的容器

    11. 盛最多水的容器 - 力扣(LeetCode) https://leetcode.cn/problems/container-with-most-water/         这题就是典型的是一道很经典的面试题,最优的解法是双指针,但很多人在第一次看到这题的时候很难想到用双指针来解(比如我)。好了,话不多说上解法: 首先我们设两个left和righ

    2024年02月14日
    浏览(30)
  • 【LeetCode力扣】11. 盛最多水的容器 (中等)

      目录 1、题目介绍 2、解题 2.1、解题思路  2.2、图解说明  2.3、解题代码 原题链接: 11. 盛最多水的容器 - 力扣(LeetCode) 示例 2: 提示: n == height.length 2 = n = 105 0 = height[i] = 104 这道题最优的方法就是用双指针,我们可以用指针 left 和指针 right 分别指向数组 height[ ] 的第一

    2024年02月06日
    浏览(36)
  • LeetCode_11_中等_盛最多水的容器

    给定一个长度为 n n n 的整数数组 h e i g h t height h e i g h t 。有 n n n 条垂线,第 i i i 条线的两个端点是 ( i , 0 ) (i, 0) ( i , 0 ) 和 ( i , h e i g h t [ i ] ) (i, height[i]) ( i , h e i g h t [ i ]) 。 找出其中的两条线,使得它们与 x x x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的

    2024年01月24日
    浏览(35)
  • 「优选算法刷题」:盛最多水的容器

    给定一个长度为  n  的整数数组  height  。有  n  条垂线,第  i  条线的两个端点是  (i, 0)  和  (i, height[i])  。 找出其中的两条线,使得它们与  x  轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明: 你不能倾斜容器。 示例 1: 示例 2: 这道

    2024年01月19日
    浏览(50)
  • 【力扣算法12】之 11. 盛最多水的容器 python

    给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明 :你不能倾斜容器。 输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包