11. Container With Most Water

题意

给定n个非负整数\(a_1,a_2,...,a_n\),其中每个数表示坐标点\((i,a_i)\),i是数组下标,\(a_i\)是对应高度.寻找两条线,使得两条线构成的长方形面积最大,盛水最多.

question_11.jpg

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

暴力破解

对每种情况进行循环,计算对应的面积,同时保存最大的面积.

class Solution {
public:int maxArea(vector<int>& height) {if (height.size()<2)return 0;int res = 0;for(int i=0;i<height.size();i++){for(int j=i+1;j<height.size();j++){int minH = min(height[i], height[j]);res = max(res, minH*(j-i));}}return res;}
};

时间复杂度O(N*N).时间复杂度太高.而复杂度太高主要是进行了一些实际上并不需要的计算,尽管利用对称性,减少了一半的计算量.

双指针

思路:面积等于底*高,底是由两条线下标差决定,高是由两条线最短的线决定(木桶理论).假如有两个指针left和right分别指向头和尾,此时的面积是\(min(a[left],a[right])*(N-1)\),而且这时候的底是最长的.如果这时候的面积值并不是最大值,也就是说存在:

\(Base * Height > min(a_1,a_N) * (N-1)\).

这种情况下由于Base一定小于(N-1),也就是说Height要比之前的大,那么,应该一定\(a_1,a_N\)两条线中较短的那条线,保证面积的高度可以发生改变(增大),也就是说:

  • 如果\(a_1 < a_N\),问题变成在\(a_2,a_N\)之间查找最大面积,也就是left++;
  • 如果\(a_1 > a_N\),问题变成在\(a_1,a_{N-1}\)之间查找最大面积,也就是right--;
class Solution {
public:int maxArea(vector<int>& height) {int left=0, right = height.size()-1;int area = 0;while(left < right){area = max(area, min(height[left], height[right])*(right-left));if(height[left] < height[right]) left++;else right--;}return area;}
};

时间复杂度O(N).

优化:关注自己解法存在的问题,优化方向是什么.比如说暴力破解方法,N*N,主要是因为做了一些不必要的计算,所以下一步的优化方向就是如何减少这些计算,这就需要重新审题,发现题目中的隐藏信息以及问题存在的性质.

转载于:https://www.cnblogs.com/ysugyl/p/10134394.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何培养编程所需要的逻辑思维?

很少有人能单单通过所谓“逻辑思维”从复杂问题快速找到抽象的&#xff0c;如果有这样的人&#xff0c;他的经验&#xff0c;工具&#xff0c;方法和直觉通常起到比逻辑思维更重要的作用。写代码需要逻辑思维&#xff0c;但解决复杂问题更需要理解分析&#xff0c;写代码只是解…

jws 方式表格导出,excel文件导出,rest风格接口实现

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、思路&#xff1a;从数据库表中查出list &#xff0c;封装到 HSSFWorkook 中&#xff0c;再由HSSFWorkook 写出到 File 中, 用 res…

先思再行 闭着眼睛编程

摘要&#xff1a;解决问题最重要的习惯不是一直盯着屏幕和编写修改代码&#xff0c;某些时候&#xff0c;阻止你成功的东西恰恰会是过于努力。这时候你需要暂停一下&#xff0c;平缓你的思绪&#xff0c;换一种方法或许能带给你不一样的效果。你会花多少时间思考如何编写代码&a…

javaScript复习

ES6字符串方法&#xff1a; //console.log(String.prototype);var str "abcdefabc";//console.log(str.includes("a"));//结果true//console.log(str.includes("abf"));//结果false//console.log(str.startsWith("d"));//false//cons…

STS的安装教程-鹏鹏

STS全称Spring Tools Suite。 简介&#xff1a;Spring Tools Suite (STS)其实就是一个被包装过的Eclipse&#xff0c;主要用于快速的开发Spring项目&#xff0c;我们不用再去编辑繁琐的xml配置文件&#xff0c;而是由工具自动生成。STS有两种安装方式&#xff0c;一种是直接在E…

final的用法

final 根据程序上下文环境&#xff0c;Java关键字final有“这是无法改变的”或者“终态的”含义&#xff0c;它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变&#xff1a;设计或效率。 final类不能被继承&#xff0c;没有子类&#xff0c;f…

爱恨交织的编程语言 是什么吸引了你

摘要&#xff1a;每门编程语言都有自身独特的地方&#xff0c;那么为什么有些语言会一直存活在我们周围&#xff0c;而有些语言却逐渐被人淡忘&#xff0c;是什么吸引你&#xff1f; 每名程序员至少知道两门以上的编程语言&#xff0c;有些甚至不是所谓的编程语言&#xff08;比…

Unable to parse the date: 2017-12-30 日期格式转化失败

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff0c; 日期格式转化失败。 原因&#xff1a;参数是2017-09-23 这种格式&#xff0c;代码却是写的转为&#xff1a; &qu…

linux逻辑卷管理

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; Linux用户安装Linux操作系统时遇到的一个最常见的难以决定的问题就是如何正确地给评估各分区大小&#xff0c;以分配合适的硬盘空间。而遇到出现某个分区空间耗尽时&#xff0c;解决的方法通常是使用符…

[LeedCode]921. 使括号有效的最少添加

题目描述&#xff1a; 给定一个由 ( 和 ) 括号组成的字符串 S&#xff0c;我们需要添加最少的括号&#xff08; ( 或是 )&#xff0c;可以在任何位置&#xff09;&#xff0c;以使得到的括号字符串有效。从形式上讲&#xff0c;只有满足下面几点之一&#xff0c;括号字符串才是…

abstract的一些用法

&#xfeff;&#xfeff;abstract&#xff08;抽象&#xff09;修饰符&#xff0c;可以修饰类和方法 1&#xff0c;abstract修饰类&#xff0c;会使这个类成为一个抽象类&#xff0c;这个类将不能生成对象实例&#xff0c;但可以做为对象变量声明的类型&#xff0c;也就是编译…

github 如何设置项目的语言显示

github 会根据一个项目文件最多的那个种类的文件显示为对应的语言项目 如果想让整个项目显示为 HTML 项目, 需要进行以下步骤的设置 1.在根目录下创建一个文件 .gitattributescreate .gitattributes2.在 .gitattributes 内编辑以下内容&#xff1a; *.js linguist-languageHTML…

C++提高进阶,你知道多少?

C从零开始 ——何谓编程 引言 曾经有些人问我问题&#xff0c;问得都是一些很基础的问题&#xff0c;但这些人却已经能使用VC编一个对话框界面来进行必要的操作或者是文档/视界面来实时接收端口数据并动态显示曲线&#xff08;还使用了多线程技术&#xff09;&#xff0c;却连…

POJ 3352 Road Construction ; POJ 3177 Redundant Paths (双联通)

这两题好像是一样的&#xff0c;就是3177要去掉重边。 但是为什么要去重边呢&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;我认为如果有重边的话&#xff0c;应该也要考虑在内才是。 这两题我用了求割边&#xff0c;在去掉割边&#xff0c;用DFS缩…

postman界面变成了左右结构怎么办

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在左上角 file -- settongs中设置一下&#xff1a;

面向对象阶段个人总结

&#xfeff;&#xfeff;面向对象阶段的个人总结 我个人对面相对向的总结。我想到了我认为比较好的方法&#xff0c;就是对照每次学习一个大模块的前的章节目录进行回顾总结&#xff0c;比如我们这阶段学习是面向对象的课程&#xff0c;下面我就来按照章节 目录进行一个系统…

1.springboot:入门程序

一、Spring Boot 简介 官网英文&#xff1a; Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get st…

2018.12.18运算符,分支结构(循环),异常处理,函数

1复习 <!DOCTYPE html><html><head> <meta charset"UTF-8"> <title>复习预习</title> <style> .b { /* 作用域: {}产生的, {作用域开始的标识, }作用域结束的标识 */ /*出现在作用域中的所有内…

javax.ws.rs.NotSupportedException: Cannot consume content type

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 报错如题&#xff1a;javax.ws.rs.NotSupportedException: Cannot consume content type 解决&#xff1a;使用postman发送 post 请求访…

java异常预习

java中的异常捕获结构有try&#xff0c;catch&#xff0c;finally三部分组成。其中&#xff0c;try语句块存放的是可能发生异常的java语句&#xff1b;catch程序块在try语句块之后&#xff0c;用来激发被捕获的异常&#xff1b;finally语句块是异常处理结构的最后执行部分&…