两个指针遍历

作者: AwesomeAshe | 来源:发表于2016-03-08 09:31 被阅读130次

1,有一个很常见的问题叫子字符串,相关的问题有LCS(最长公共子字符串),还有最长对称子字符串问题。
我们先不讨论算法的优劣,直观的求子字符串方法就是遍历了,我看在求最长对称子字符串时的方法:
简单粗暴的遍历,判断
基于上一篇文章[判断字符串是否对称][1]
[1]: http://www.jianshu.com/p/0eaa1daf93d2
中的issymetrical函数,我们遍历整个字符串对所有的字符串进行检测

#include <iostream>
bool isSymmetrical(char* pbegin, char* pend)
{
    //first check valid
    if (pbegin == NULL || pend == NULL || pbegin>pend)
        return false;

    while (pbegin<pend)
    {
        if (*pbegin == *pend)
        {
            pbegin++;
            pend++;
        }
        else
            return false;
    }
    //if not return yet, return 1
    return true;
}
int getLongestSymmetricalLength(char* pstring)
{
    if (pstring == NULL)
        return 0;
    int symmetricallen = 1;//initialize
    char *pfirst = pstring;
    int len = strlen(pstring);

    //two pointers,the pfirst moves one step and plast moves (n-i)
    while (pfirst < &pstring[len - 1])//pstring[len-1] is the last one
    {
        char* plast = pfirst + 1;
        //并不是指针地址加1,而是地址加上一个偏移量,(等于char的长度)

        while (plast <= &pstring[len - 1])
        {
            if (isSymmetrical(pfirst, plast))// 对pfirst和plast直接的字符串进行判断
            {
                int newlen = plast - pfirst+1;//同样这里相减也得到的是地址差除以偏移量之后的值
                if (newlen > symmetricallen)
                    symmetricallen = newlen;
            }
            plast++;
        }
        pfirst++;
    }
    return symmetricallen;
}

然而这种解法的复杂度为O(n3),遍历字符串复杂度nn,判断又是n.


2,第二个问题是,

输出一个单向链表中的倒数第k个元素。

我们可以先遍历一次得到长度然后再遍历n-k个元素

当然有一个更简单的思路:
用两个游标记录位置并遍历。
第一个游标从头开始遍历,然后第二个游标与第一个相差k个元素,当第一个游标结束后,第二个也就是倒数第k个元素。

我们先用一个for循环k次,将第一个指针移动到一个位置;
然后再同时移动两个指针,知道第一个指针到达链表尾。

3,第三个问题:

寻找排序数组中和为定值的两个数。

当然不能遍历所有的组合啊,太低效了。
我们可以这样想,既然是排好序的数组,我们先把第一个和最后一个数加起来看其和与给定值的关系。

  • 如果刚好是给定值,输出。
  • 如果和小于给定值,那么肯定是最小值太小了,把最小值往上移;
    重复上述;
  • 如果和大于给定值,那么肯定是最大值大了,我们把最大值往下移,重复上述。

这里用一个while循环判断两个游标的大小关系就可以啦,,不要想的太复杂!

相关文章

  • 两个指针遍历

    1,有一个很常见的问题叫子字符串,相关的问题有LCS(最长公共子字符串),还有最长对称子字符串问题。我们先不讨论算...

  • 链表常见问题汇总

    1.给一个单链表,判断其中是否有环的存在;两个指针同时从头指针开始遍历链表,一个每次遍历一个,另外一个每次遍历两个...

  • 2018-08-21 LeetCode 相交链表(无环)

    双指针,p指针先遍历A再遍历B,q指针先遍历B再遍历A,如果相交则一定会有p==q

  • 160 intersection of two linked l

    两个指针分别单步遍历链表,当访问到尾部额时候,指向另外一个链表的头继续遍历,直到两个指针相遇就返回 对于[1] 两...

  • LeetCode—— 移动零

    题目描述 一、CPP 1. 双指针法: 解题思路:使用两个指针,指针 i 负责遍历数组,指针 j 负责其后的元素均...

  • c基础—指针运算和函数指针

    二级指针 数组和数组指针 采用指针遍历数组循环赋值 遍历 赋值 指针与数组的几种写法 函数指针(回调) 题目:监听...

  • 算法面试常用套路之双指针法dual pointers, 2022

    (2022.08.16 Tues)双指针法采用两个指针/变量,对容器进行遍历。容器类型包括,数组、链表、字符串等。...

  • leetcode 35. 搜索插入位置 javascript

    这道题主要考察指针的遍历,我想到两种遍历方式 两个指针i和i+1,如果target不等于其中任意一个,则比较i <...

  • [Leetcode] [Tag 双指针] Python 刷题总结

    双指针的题,即利用两个指针去遍历数组。往往涉及到有序的范围,可以通过左右的加减来减少暴力遍历的次数。 11. Co...

  • 排序-贪心排序

    情况1:对于数组 快慢指针思想慢指针遍历每一个位置,快指针也遍历每一个位置慢指针每遍历一个位置就停下来给快指针时间...

网友评论

    本文标题:两个指针遍历

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