Leetcode 11. 盛最多水的容器

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

 

 

思路1 双循环(超时了)

1. 确定计算公式

res = min(height[i], height[j]) * (j - i)

2.使用双循环计算出所有的值,保留最大值。

func maxArea(height []int) int {
	res := 0
	length := len(height)
	if length < 2 {
		return res
	}
	for i := 0; i < length; i++ {
		for j := i + 1; j < length; j++ {
			temp := min(height[i], height[j]) * (j - i)
			res = max(temp, res)
		}
	}
	return res
}

func max(v1, v2 int) int {
	if v1 > v2 {
		return v1
	} else {
		return v2
	}
}

func min(v1, v2 int) int {
	if v1 > v2 {
		return v2
	} else {
		return v1
	}
}

  

 

 

思路2 双指针

1. 首先确定计算公式 

res = min(height[left],height[right])*(right-left)

2. 由公式可以看出,res的大小由短板来决定。

  在移动指针时,如果移动短板,短板可能会变大,res也可能会增大。

  如果移动长板,短板不变的情况下,长板可能不变或者变小,从而导致res不变或者变小。

3. 因此,初始化双指针分列位于左右两端,循环每轮将短板向内移动一格,并更新res最大值,直到指针相遇时跳出;即可获得最大面积。

func maxArea(height []int) int {
	res := 0
	length := len(height)
	if length < 2 {
		return res
	}
	left := 0
	right := length - 1
	for left < right {
		if height[left] < height[right] {
			res = max(res, height[left]*(right-left))
			left += 1
		} else {
			res = max(res, height[right]*(right-left))
			right -= 1
		}
	}
	return res
}

func max(v1, v2 int) int {
	if v1 > v2 {
		return v1
	} else {
		return v2
	}
}

  

 

posted @ 2022-05-21 23:26  SoutherLea  阅读(23)  评论(0编辑  收藏  举报