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