题目: 盛最多水的容器
来自智得网
方法一:暴力法
暴力法是最直接的解决方法,它的思路是遍历所有可能的容器组合,计算它们的面积,并找到最大的面积。 具体步骤:
- 初始化最大面积为0。
- 使用两个指针,一个指向数组的起始位置,一个指向数组的末尾位置。
- 计算当前容器的面积,即两个指针之间的距离乘以较小的高度。
- 更新最大面积为当前面积和最大面积中的较大值。
- 将较小的指针向内移动一步,重复步骤3和步骤4,直到两个指针相遇。
#include <iostream>
#include <vector>
using namespace std;
int maxArea(vector<int>& height) {
int n = height.size();
int maxArea = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
int area = min(height[i], height[j]) * (j - i);
maxArea = max(maxArea, area);
}
}
return maxArea;
}
int main() {
vector<int> height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
int result = maxArea(height);
cout << "Max area: " << result << endl;
return 0;
}
import java.util.Arrays;
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int maxArea = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
int area = Math.min(height[i], height[j]) * (j - i);
maxArea = Math.max(maxArea, area);
}
}
return maxArea;
}
}
public class Main {
public static void main(String[] args) {
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
Solution solution = new Solution();
int result = solution.maxArea(height);
System.out.println("Max area: " + result);
}
}
package main
import "fmt"
func maxArea(height []int) int {
n := len(height)
maxArea := 0
for i := 0; i < n-1; i++ {
for j := i + 1; j < n; j++ {
area := min(height[i], height[j]) * (j - i)
maxArea = max(maxArea, area)
}
}
return maxArea
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
height := []int{1, 8, 6, 2, 5, 4, 8, 3, 7}
result := maxArea(height)
fmt.Println("Max area:", result)
}
def maxArea(height):
n = len(height)
maxArea = 0
for i in range(n - 1):
for j in range(i + 1, n):
area = min(height[i], height[j]) * (j - i)
maxArea = max(maxArea, area)
return maxArea
height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
result = maxArea(height)
print("Max area:", result)
function maxArea(height) {
let n = height.length;
let maxArea = 0;
for (let i = 0; i < n - 1; i++) {
for (let j = i + 1; j < n; j++) {
let area = Math.min(height[i], height[j]) * (j - i);
maxArea = Math.max(maxArea, area);
}
}
return maxArea;
}
let height = [1, 8, 6, 2, 5, 4, 8, 3, 7];
let result = maxArea(height);
console.log("Max area:", result);
方法二:双指针法
双指针法是一种优化的方法,它通过不断移动较小的指针来缩小搜索范围。 具体步骤:
- 初始化最大面积为0。
- 使用两个指针,一个指向数组的起始位置,一个指向数组的末尾位置。
- 计算当前容器的面积,即两个指针之间的距离乘以较小的高度。
- 更新最大面积为当前面积和最大面积中的较大值。
- 将较小的指针向内移动一步,重复步骤3和步骤4,直到两个指针相遇。
#include <iostream>
#include <vector>
using namespace std;
int maxArea(vector<int>& height) {
int n = height.size();
int maxArea = 0;
int left = 0, right = n - 1;
while (left < right) {
int area = min(height[left], height[right]) * (right - left);
maxArea = max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
int main() {
vector<int> height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
int result = maxArea(height);
cout << "Max area: " << result << endl;
return 0;
}
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int maxArea = 0;
int left = 0, right = n - 1;
while (left < right) {
int area = Math.min(height[left], height[right]) * (right - left);
maxArea = Math.max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
}
public class Main {
public static void main(String[] args) {
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
Solution solution = new Solution();
int result = solution.maxArea(height);
System.out.println("Max area: " + result);
}
}
package main
import "fmt"
func maxArea(height []int) int {
n := len(height)
maxArea := 0
left, right := 0, n-1
for left < right {
area := min(height[left], height[right]) * (right - left)
maxArea = max(maxArea, area)
if height[left] < height[right] {
left++
} else {
right--
}
}
return maxArea
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
height := []int{1, 8, 6, 2, 5, 4, 8, 3, 7}
result := maxArea(height)
fmt.Println("Max area:", result)
}
def maxArea(height):
n = len(height)
maxArea = 0
left, right = 0, n - 1
while left < right:
area = min(height[left], height[right]) * (right - left)
maxArea = max(maxArea, area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return maxArea
height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
result = maxArea(height)
print("Max area:", result)
function maxArea(height) {
let n = height.length;
let maxArea = 0;
let left = 0, right = n - 1;
while (left < right) {
let area = Math.min(height[left], height[right]) * (right - left);
maxArea = Math.max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
let height = [1, 8, 6, 2, 5, 4, 8, 3, 7];
let result = maxArea(height);
console.log("Max area:", result);
方法三:动态规划法
动态规划法通过存储子问题的解来避免重复计算,从而提高效率。 具体步骤:
- 初始化最大面积为0。
- 使用两个指针,一个指向数组的起始位置,一个指向数组的末尾位置。
- 计算当前容器的面积,即两个指针之间的距离乘以较小的高度。
- 更新最大面积为当前面积和最大面积中的较大值。
- 将较小的指针向内移动一步,重复步骤3和步骤4,直到两个指针相遇。
#include <iostream>
#include <vector>
using namespace std;
int maxArea(vector<int>& height) {
int n = height.size();
int maxArea = 0;
int left = 0, right = n - 1;
while (left < right) {
int h = min(height[left], height[right]);
int area = h * (right - left);
maxArea = max(maxArea, area);
while (left < right && height[left] <= h) {
left++;
}
while (left < right && height[right] <= h) {
right--;
}
}
return maxArea;
}
int main() {
vector<int> height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
int result = maxArea(height);
cout << "Max area: " << result << endl;
return 0;
}
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int maxArea = 0;
int left = 0, right = n - 1;
while (left < right) {
int h = Math.min(height[left], height[right]);
int area = h * (right - left);
maxArea = Math.max(maxArea, area);
while (left < right && height[left] <= h) {
left++;
}
while (left < right && height[right] <= h) {
right--;
}
}
return maxArea;
}
}
public class Main {
public static void main(String[] args) {
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
Solution solution = new Solution();
int result = solution.maxArea(height);
System.out.println("Max area: " + result);
}
}
package main
import "fmt"
func maxArea(height []int) int {
n := len(height)
maxArea := 0
left, right := 0, n-1
for left < right {
h := min(height[left], height[right])
area := h * (right - left)
maxArea = max(maxArea, area)
for left < right && height[left] <= h {
left++
}
for left < right && height[right] <= h {
right--
}
}
return maxArea
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
height := []int{1, 8, 6, 2, 5, 4, 8, 3, 7}
result := maxArea(height)
fmt.Println("Max area:", result)
}
def maxArea(height):
n = len(height)
maxArea = 0
left, right = 0, n - 1
while left < right:
h = min(height[left], height[right])
area = h * (right - left)
maxArea = max(maxArea, area)
while left < right and height[left] <= h:
left += 1
while left < right and height[right] <= h:
right -= 1
return maxArea
height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
result = maxArea(height)
print("Max area:", result)
function maxArea(height) {
let n = height.length;
let maxArea = 0;
let left = 0, right = n - 1;
while (left < right) {
let h = Math.min(height[left], height[right]);
let area = h * (right - left);
maxArea = Math.max(maxArea, area);
while (left < right && height[left] <= h) {
left++;
}
while (left < right && height[right] <= h) {
right--;
}
}
return maxArea;
}
let height = [1, 8, 6, 2, 5, 4, 8, 3, 7];
let result = maxArea(height);
console.log("Max area:", result);