美文网首页
算法笔记(6)| two pointers

算法笔记(6)| two pointers

作者: yzbkaka | 来源:发表于2019-08-07 15:34 被阅读0次

    two pointers是算法编程中一种非常重要的思想,它的主要内容是利用问题本身与序列的特性,使用两个下标i,j对序列进行扫描,以较低的复杂度解决问题。

    1.序列求和问题

    给定一个递增的序列和一个数M,要求在序列里面找到两个数,并让它们的和等于M

    这道题目的一般解法就是使用两个循环来遍历查找符合要求的数,但是注意到这道题所给出的序列是递增的,因此使用循环遍历查找的方法没有完全利用到题目,并且时间复杂度为(n^2),在针对较大的序列来说是不可取的。

    利用two pointers思想,我们可以对序列设置两个下标i,j。让i指向序列的开始位置,j指向序列的末尾位置,然后根据两者所指向数的和与M的大小进行比较来决定它们的移动方向。

    void twoPointers(int a[],int n){  //数组以及数组的大小
        int i=0,j=n-1;
        while(i<j){
            if(a[i]+a[j]==M){
                printf("%d %d\n",a[i],a[j]);
                i++;
                j--;
            }
            else if(a[i]+a[j]<M){
                i++;
            }
            else if(a[i]+a[j]>M){
                j--;
            }
        }
    }
    

    使用two pointers方法所需要的时间复杂度为O(n)。

    2.序列合并问题

    假设有两个递增序列A、B,要求将它们合并为一个递增序列C

    对这道题同样使用two pointers思想:

    void twoPointers(int a[],int b[],int c[],int n,int m){  //n和m代表a[]与b[]的长度
        int i=0,j=0,k=0;
        while(i<n && j<m){
            if(a[i]<=b[j]){
                c[k]=a[i];
                k++;
                i++;
            }
            else if(a[i]>b[j]){
                c[k]=b[j];
                k++;
                j++;
            }
        }
        while(i<n){
            c[k]=a[i];
            i++;
            k++;
        }
        while(j<m){
            c[k]=b[j];
            k++;
            j++:
        }
    }
    

    相关文章

      网友评论

          本文标题:算法笔记(6)| two pointers

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