算法题连击-盛最多水的容器

描述

  • 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

  • 说明:你不能倾斜容器,且 n 的值至少为 2。

算法题连击-盛最多水的容器_第1张图片

  • 示例:
    • 输入: [1,8,6,2,5,4,8,3,7]
    • 输出: 49

解题

暴力法

  • 循环两次,X为两个相差的index,Y为两个值中的最小值
let maxAreaList=[1,8,6,2,5,4,8,3,7];

function maxArea(){
	let maxAreaNum=''
	maxAreaList.forEach((a,aIndex)=>{
		maxAreaList.forEach((b,bIndex)=>{
			let y=a>b?b:a
			let x=bIndex-aIndex
			let maxAreaNumXY=x*y;
			maxAreaNum=maxAreaNum>maxAreaNumXY?maxAreaNum:maxAreaNumXY
		})
	})
	console.log(maxAreaNum);
}

双指针

  • 头尾取值,index和较小的值相乘得到容量
  • 那个值小则向前移动
  • 直到相遇,i和n相加=数组的.length-1
function maxArea(){
	let i=0;
	let n=0;
	let maxAreaNum=0;
	let length=maxAreaList.length-1
	while(i+n!==length){
		console.log(i,n);
		let x=length-n-i
		// let y=maxAreaList[length-n]>?maxAreaList[i]:maxAreaList[length-n]
		let y=Math.min(maxAreaList[length-n],maxAreaList[i])
		let maxAreaNumXY=x*y;
		// maxAreaNum=maxAreaNum>maxAreaNumXY?maxAreaNum:maxAreaNumXY
		maxAreaNum=Math.max(maxAreaNum,maxAreaNumXY)
		maxAreaList[length-n]>maxAreaList[i]?i++:n++
	}
}
  • 之前取大小值的时候,用的是三元运算符(执行时间92 ms ),后改成了Math.max/min 取大小值,时间缩短为:56 ms

你可能感兴趣的:(算法与数据结构,算法,盛最多水的容器,双指针)