数组类算法-2双指针对撞法

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;
    }
}

在有序数据操作时,利用双指针往往能得到高效的解决方法。

猜你喜欢

转载自blog.csdn.net/weixin_44315921/article/details/86291369