美文网首页算法
尺取法(双指针)

尺取法(双指针)

作者: _NewMoon | 来源:发表于2020-04-29 23:07 被阅读0次

尺取法,顾名思义,就是用一把尺子,不断向右移动,在移动过程中维护某一性质并更新答案的方法,这种方法一般用来求满足某一条件的最短区间。

参考博客(链接):点我跳转
实现步骤:

  • 1.初始化左右端点
  • 2.不断扩大右端点,直至满足条件
  • 3.如果直至终点也无法满足条件,则终止,否则更新结果
  • 4.扩大左端点(右移1),跳回步骤2

从一个例题来认识一下此过程(网上举得例子好像都是这个):

poj3601

大致题意:给定一个数组,再给定一个整数s,求数组中的一个最短连续序列,要求该序列和大于等于s

这里借助https://blog.csdn.net/weixin_41162823/article/details/80328404
的图片演示:

pic

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e5+100;

int t,n,s;
long long a[N];

int main()
{
    cin>>t;
    while(t--){
        cin>>n>>s;
        for(int i = 1; i<=n; i++) cin>>a[i];
        
        long long l = 1,r = 1,sum = 0,res = N;
        while(1){
            while(r <= n && sum < s) sum += a[r++];  //步骤2
            if(sum < s) break;                       //步骤3
            res = min(res,r-l);
            sum -= a[l++];                          //步骤4
        }
        if(res == N) cout<<0<<endl;
        else cout<<res<<endl;
    }
    return 0;
}

update on 2020/06/12

LeetCode15.三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

solution:

答案中不可以包含重复的三元组,所以我们可以对数组先排序,与两数之和不同的是,这里要找到三个数,其和为0,可以做一个转化,固定a,那么找b+c=-a即可,这就转换成了两数之和的问题,因为每次b向后枚举,数组是从小到大排列的,所以c不会比上次的c大,那么可以利用双指针来做,c从后向前遍历,b从a的后面向后遍历,找到两数之和为-a,时间复杂度为O(N^2)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        //solution: 先对数组排序,固定a,向后枚举b因为每次b会增大,所以可以从后向前找c
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        int n = nums.size();
        if(!n) return ans;

        if(nums[0] > 0) return ans;
        
        for(int a = 0; a<n; a++){
            if(a>0 && nums[a] == nums[a-1]) continue;

            int sum = -nums[a];
            int c = n-1;

            for(int b = a+1; b<n; b++){
                if(b > a+1 && nums[b] == nums[b-1]) continue;

                while(b < c && nums[b] + nums[c] > sum) -- c;

                if(b == c) break;

                if(nums[b] + nums[c] == sum){
                    ans.push_back({nums[a], nums[b], nums[c]});
                }
            }
        }
        return ans;
    }
};

相关文章

  • 尺取法(双指针)

    尺取法,顾名思义,就是用一把尺子,不断向右移动,在移动过程中维护某一性质并更新答案的方法,这种方法一般用来求满足某...

  • 尺取法

    尺取法 尺取法核心思路 尺取法其实也是一种模拟,是解决寻找区间和问题的一种方法。 假如有这么一个问题:给你一些数,...

  • 尺取法

    尺取法是比赛中一个很有意思的技巧。尺取法一般要保证数列的单调性才能使用。 (POJ - 2566)Bound Fo...

  • 尺取法 | 习题集

    写在前面 下面整理了五道关于尺取法的习题,通过题目进一步理解尺取法这一技巧。 POJ 3061——Subseque...

  • ZXAlgorithm - C7 Two Pointers

    Outline相向双指针同向双指针 Two SumPartitionSort 0 Templete 同向双指针,相...

  • 双指针:15.三数之和

    考点:双指针 使用双指针搜索之前排序 动态循环双指针m,n

  • 尺取法 | 入门介绍篇

    写在前面: 尺取法,一种神奇的技巧。在Codeforces中显示它的算法名称叫做"two pointers", 直...

  • Python算法-双指针(Two Pointers)

    双指针分为「对撞指针」、「快慢指针」、「分离双指针」。 参考来源:https://algo.itcharge.cn...

  • 第九届蓝桥杯_日志统计(尺取法的运用)

    当我看到这题的时候立刻眼前一亮,觉得这是一个很经典的尺取法案例,我觉的好处就在于对初了解尺取法的训练,通过该题能检...

  • 双指针法(Swift代码篇)

    双指针法有三种: 左右指针法(头尾指针法) 快慢指针法 滑动窗口 左右指针法 左右指针法是最常见的双指针法,左右两...

网友评论

    本文标题:尺取法(双指针)

    本文链接:https://www.haomeiwen.com/subject/zcdowhtx.html