一道算法题
题目: 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线,垂直线 i的两个端点分别为(i,ai) 和 (i, 0) 。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/container-with-most-water
解法一:暴力解法
private static int method01(int[] num) {
int maxArea=0;
if(num==null||num.length==0){
return maxArea;
}
for (int i = 0; i < num.length-1; i++) {
for (int j = i+1; j < num.length; j++) {
maxArea=Math.max(maxArea,(j-i)*Math.min(num[i],num[j]));
}
}
return maxArea;
}
public static void main(String[] args) {
int[] num={4,3,2,1,4};
int area=method01(num);
System.out.println("area:"+area);
}
测试结果一: 测试结果二:
解法二:双指针解法
- 两个指针一个数组头一个数组尾部,当index01==index02时,退出
private static int method02(int[] num) {
if(num==null||num.length==0){
throw new NullPointerException("it Cannot Be Empty");
}
int maxArea=0;
for(int left=0,rigth=num.length-1;left<rigth;){
int min=num[left]<num[rigth]?num[left++]:num[rigth--];
maxArea=Math.max(maxArea,(rigth+1-left)*min);
}
return maxArea;
}
测试结果一:
测试结果二:
|