(1)左右指针
一个指针指向开端,另一指针指向末尾
关键在于左右指针如何移动来满足题目规则。
例子:
11. 盛最多水的容器
双指针(i,j),i为height左指针,j为height右指针
因所求square=两个指针指向的数字中较小值∗指针之间的距离
决定的。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。(参考快排)
int maxArea(int* height, int heightSize){
int i=0,j=heightSize-1;
int max=0;
while(i<j){
int square=fmin(height[i],height[j])*(j-i);
if(height[i]<height[j])i++;
else j--;
if(max<square) max=square;
}
return max;
}
977. 有序数组的平方
因为平方按照非递减排序,指针移动nums[i]*nums[i]与nums[j]*nums[j]中大的那一个
//两指针i,j,一个指向数组开头一个指向数组末端
class Solution {
public int[] sortedSquares(int[] nums) {
int []array=new int[nums.length];
int i=0,j=nums.length-1;
int k=nums.length-1;
while(i<=j){
int a=nums[i]*nums[i];
int b=nums[j]*nums[j];
if(a>b)
{
i++;
array[k--]=a;
}
else {
j--;
array[k--]=b;
}
}
return array;
}
}