1.盛最多水的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。
class Solution {
public int maxArea(int[] height) {
int i=0;
int j=height.length-1;
int max=Integer.MIN_VALUE;
while(i<j) {
int temp=Math.min(height[i], height[j]);
max=Math.max(max, (j-i)*temp);
if(height[i]<=height[j]) {
i++;
}else {
j--;
}
}
return max;
}
}
2两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
class Solution {
public int[] twoSum(int[] numbers, int target) {
int i=0;
int j=numbers.length-1;
while(i<=j){
if(numbers[i]+numbers[j]==target)break;
if(numbers[i]+numbers[j]<target)i++;
if(numbers[i]+numbers[j]>target)j--;
}
int out[]={i+1,j+1};
return out;
}
}
在有序数据操作时,利用双指针往往能得到高效的解决方法。