0
点赞
收藏
分享

微信扫一扫

双指针【更新ing】

微笑沉默 2022-01-20 阅读 147

(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;
    }
}
举报

相关推荐

0 条评论