2. Pattern: two points, 双指针类型

目录

力扣经典题

Pair with Target Sum (easy)

26. 删除排序数组中的重复项Remove Duplicates (easy)

80. 删除排序数组中的重复项 IIRemove Duplicates (easy)

977. 有序数组的平方Squaring a Sorted Array (easy)

Triplet Sum to Zero (medium)

Triplet Sum Close to Target (medium)

Triplets with Smaller Sum (medium)

713. 乘积小于K的子数组Subarrays with Product Less than a Target (medium)

Dutch National Flag Problem (medium)


双指针是这样的模式:两个指针朝着左右方向移动(双指针分为同向双指针和异向双指针),直到他们有一个或是两个都满足某种条件。双指针通常用在排好序的数组或是链表中寻找对子。比如,你需要去比较数组中每个元素和其他元素的关系时,你就需要用到双指针了。

我们需要双指针的原因是:如果你只用一个指针的话,你得来回跑才能在数组中找到你需要的答案。这一个指针来来回回的过程就很耗时和浪费空间了+—+这是考虑算法的复杂度分析的时候的重要概念。虽然brute+force一个指针的解法可能会奏效,但时间复杂度一般会是O(n²)。在很多情况下,双指针能帮助我们找到空间或是时间复杂度更低的解。

判断使用双指针:

  • 一般来说,数组或链表是排好序的,你需要在里面找一些组合满足某种限制条件
  • 这种组合可能是一对数,三个数,或是一个子数组

力扣经典题

网上流传的力扣分类的经典题,我找的对应的中文题目,若有不全,不对请指正。

Pair with Target Sum (easy)

26. 删除排序数组中的重复项Remove Duplicates (easy)

//双指针
class Solution {
    public int removeDuplicates(int[] nums) {
        int left=0,right=0;
        int len=nums.length;
        while(right<len){
            while(right<len&&nums[left]==nums[right]){
                right++;
            }
            if(right<len){
                left++;
                nums[left]=nums[right];
            }
        }
        return left+1;
    }
}


class Solution {
    public int removeDuplicates(int[] nums) {
        int len=nums.length;
        if(len==0||len==1){
            return len;
        }
        int l=0,r=1;
        while(r<len){
            if(nums[l]==nums[r]){
                r++;
            }else{
                l++;
                nums[l]=nums[r];
            }
        }
        return l+1;
    }
}

 

80. 删除排序数组中的重复项 IIRemove Duplicates (easy)

class Solution {
    public int removeDuplicates(int[] nums) {
        int left=0,right=0;
        int len=nums.length;


        while(right<len){
            boolean x=true;//左指针右移一位
            if(right+1<len&&nums[right]==nums[right+1]){
                x=false;//移两位
            }
            int temp=nums[right];
            while(right<len&&nums[right]==temp){
                right++;
            }
            if(x){
                nums[left]=temp;
                left++;
            }else{
                nums[left]=temp;
                left++;
                nums[left]=temp;
                left++;
            }
        }
        return left;
    }
}

977. 有序数组的平方Squaring a Sorted Array (easy)

//左右指针在数组两端,向中间移动,两者比较 大的入数组,最后返回数组的逆序(也可以直接逆着放入数组)

class Solution {
    public int[] sortedSquares(int[] A) {
        int len=A.length;
        int[] ans=new int[len];
        int left=0,right=len-1;

        while(left<=right){
            if(A[left]*A[left]<=A[right]*A[right]){
                ans[right-left]=A[right]*A[right];
                right--;
            }else{
                ans[right-left]=A[left]*A[left];
                left++;
            }
        }
        return ans;
    }
}

Triplet Sum to Zero (medium)

Triplet Sum Close to Target (medium)

Triplets with Smaller Sum (medium)

713. 乘积小于K的子数组Subarrays with Product Less than a Target (medium)

class Solution {
    public int numSubarrayProductLessThanK(int[] nums, int k) {
        if (k <= 1) return 0;
        int prod = 1, ans = 0, left = 0;
        for (int right = 0; right < nums.length; right++) {
            prod *= nums[right];
            while (prod >= k) prod /= nums[left++];
            ans += right - left + 1;
        }
        return ans;
    }
}

Dutch National Flag Problem (medium)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值