详解C语言中双指针算法的使用

 更新时间:2022年08月18日 11:48:04   作者:微凉秋意  
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。本文将通过示例带大家深入了解双指针算法的使用

前言

双指针算法

算法思想

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。

今天带大家来学习算法中双指针的应用场景。

一、最长不含重复字符的子字符串

1.题目要求

2.个人题解

2.1 解题思路

利用双指针,定义一个指针i和一个指针j

让i开始走,固定住j,然后我们利用一个辅助数组来记录下每个字符出现的次数。

比如对于字符串“abcabcdd”,当i走到第二个a的时候,a出现了两次,这时候让j开始向前走,走到b。

这时候i和j之间的字符串是bca。没有重复的,i可以继续走,j继续固定。

i走到b的时候b出现两次。这时候要移动j直至没有字符出现次数超过两次。如此反复直到i走到字符串结尾。

2.2 代码实现

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    int lengthOfLongestSubstring(string s) {
        int len = s.length();
        int S[128];
        memset(S,0x00, sizeof(S));
        int ans = 0;
        for(int i=0,j=0;i<len;++i)
        {
            S[s.at(i)]++;
            while(S[s.at(i)]>1)
            {
                S[s.at(j)]--;
                j++;
            }
            ans=max(ans,i-j+1); //更新区间最大长度
        }
        return ans;
    }
};

2.3 代码解析

首先定义数组S[128],利用memset函数来初始化该数组。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

for循环里声明i,j 为0,先让字符串的第一个字符对应的整数作为数组S的下标,该位置元素值加一;

如果没有重复字符,ans递增;如果有重复字符今后进入while循环,随着j的递增,之前数组里为一的元素值都会减一,为2的元素值也会减一并变为一;

接着j固定,i继续增长,再有重复字符就会重复上述操作,最终通过max函数得到最大的无重复子字符串长度。

二、和为S的两个数字

1.题目要求

2.个人题解

2.1 解题思路

根据题目可知该数组是升序排列,那我们可以用两个指针:一个在左边界,一个在右边界。

如果数组下标对应的值相加比num小,那么就让左边指针递增,反之则右边指针递减。

如果左右指针相等,说明没有满足条件的数对,返回空数组。

如果存在该数对,利用push_back方法插入数组并返回即可

2.2 代码实现

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int left,right;
        int i,j,k;
        vector<int> res;
        left=0;
        right=array.size()-1;
        //如果数组为空,返回空数组
        if(array.empty()){
            return res;
        }
        while(array[left]+array[right]!=sum && left!=right){
            if(array[left]+array[right]<sum){
                left+=1;
            }else if(array[left]+array[right]>sum){
                right-=1;
            }
        }
        //如果不存在该数对,返回空数组
        if(left==right){
            return res;
        }
        //如果存在
        res.push_back(array[left]);
        res.push_back(array[right]);
        return res;
    }
};

本题思路确定后代码比较好理解,就没有分析部分了。

这两道题都是双指针的解法:第一题相当于是相邻指针,第二题则是双端指针,各有特色。

到此这篇关于详解C语言中双指针算法的使用的文章就介绍到这了,更多相关C语言 双指针算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析C++ 浮点数的格式化输出

    解析C++ 浮点数的格式化输出

    本篇文章是对C++中浮点数的格式化输出进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 关于C++运算符重载的一些困惑详解

    关于C++运算符重载的一些困惑详解

    这篇文章主要给大家介绍了关于C++运算符重载的一些困惑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++实现LeetCode(60.序列排序)

    C++实现LeetCode(60.序列排序)

    这篇文章主要介绍了C++实现LeetCode(60.序列排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • DEV C++自动补全文件头的设置操作教程

    DEV C++自动补全文件头的设置操作教程

    Dev-C++ 是一款轻量级的集成开发环境 (IDE),主要用于 C 和 C++ 的程序编写,它提供了基本的功能来帮助开发者更高效地工作,其中包括文件头的自动补全功能,本文就给大家介绍了DEV C++自动补全文件头的设置操作教程,需要的朋友可以参考下
    2025-04-04
  • C语言图书管理系统简洁版

    C语言图书管理系统简洁版

    这篇文章主要为大家详细介绍了C语言图书管理系统简洁版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++设计模式之简单工厂模式的实现示例

    C++设计模式之简单工厂模式的实现示例

    这篇文章主要给大家介绍了关于C++设计模式之简单工厂模式的相关资料,简单工厂模式,主要用于创建对象,添加类时,不会影响以前的系统代码,需要的朋友可以参考下
    2021-06-06
  • C语言实现一个简易通讯录

    C语言实现一个简易通讯录

    这篇文章主要为大家详细介绍了C语言实现一个简易通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C语言实现绘制南丁格尔玫瑰图的示例代码

    C语言实现绘制南丁格尔玫瑰图的示例代码

    玫瑰图中有一种不等半径的统计图称为南丁格尔玫瑰图,网上很热门,是一很有艺术感的漂亮的统计图,下面我们就来看看如何使用C语言绘制它吧
    2024-03-03
  • C++ 容器中map和unordered map区别详解

    C++ 容器中map和unordered map区别详解

    这篇文章主要为大家介绍了C++ 容器中map和unordered map区别示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • QT使用udp实现发送与接收图片

    QT使用udp实现发送与接收图片

    这篇文章主要为大家详细介绍了QT如何使用udp协议实现发送与接收图片功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12

最新评论