同向双指针

lintcode 1870 · Number of Substrings with All Zeroes

lintcode 610 · Two Sum - Difference equals to target

leetcode 1759. Count Number of Homogenous Substrings

leetcode 1513. Number of Substrings With Only 1s

这四道题目的思路和代码相似。都是用的双指针。

为何用双指针那?

首先, 这三套题目都有个现象, contiguis subarray,并且subarray都是要一样的元素。

那么就能用双指针,一个指向相同元素的头,一个指向尾部。

先把框架写出来。同向双指针的大概模板如下:

int j = 1;

for(int i = 0;i<n;i++){

j = max(i+1, j)// 确保j比i大

    while(j < n && j, i 不满足要求的条件)

            j++;

    if(退出while的原因1)

        xxxx

if(退出while的原因2)

   xxxxx

}

举个例子

610 · Two Sum - Difference equals to target

两数之差等于target

首先这道题目给出了是排好序的。 重要条件。

排好序。。。二分或者同向双指针。。。

要让j往后走的 j,i不满足要求的条件是

num[j]-num[ i]  < target

一旦退出就是num[j]-num[ i]  >=target

那就可以判断了

如果j-i == target,那么就是想要的答案

如果num[j]-num[ i]  > target, 那么i 只能往后移动了。

代码如下:

class Solution {

public:

    /**

     * @param nums: an array of Integer

     * @param target: an integer

     * @return: [num1, num2] (index1 < index2)

     */

    vector<int> twoSum7(vector<int> &nums, int target) {

        // write your code here

        target = abs(target);

        int n = nums.size();

        int j = 1;

        for(int i =0;i<n;i++){

            j = max(j, i+1);

            while(j < n && nums[j] - nums[i] < target)

                j++;

           

            if(j >=n)

                break;

            if(nums[j] - nums[i] == target)

                return {nums[i], nums[j]};

        }

        return {-1, -1};

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值