C 语言双指针技术程序2025年1月7日 | 阅读 6 分钟 引言在计算机科学和算法问题的领域,严谨的证明、表达的便捷性和美感是主要因素。双指针技术 展示了一种突出巫师和女巫之间的两种对立的方法,确保了控制点,并平衡了双方的需求和看法。该方法非常有效,可以在许多情况下使用,以决定如何最好地利用可用时间和工具。在本文中,我们将深入探讨该技术的主题,并考虑其在各种编程语言中执行的每个细节。 什么是双指针技术?双指针技术 从移动数组中不同位置的两个指针开始。一个指针朝另一个指针移动,而另一个指针以相同的方向移动,但有一定的特定条件。这是确保通过正确移动指针来解决差异问题的一种最佳方式。 理解双指针技术指针技术 的概念通过使用两个指针来解决问题来保持其名称的含义。通常,这些指针从起始点以相同的速度指向数组或链表,朝向解决方案。当需要搜索、排序或管理数组甚至更复杂结构(如链表)中的数据时,它的使用就变得重要了。 关键概念- 初始化: 如果我们构建了两个指针,它们指向数组的开头、结尾,或者如果我们在处理链表,则可能指向两者。
- 遍历: 包含条件和会合方向的方向应引起注意,然后进行更新。相反,它可能是最适合当前操作需求的一种。
- 条件检查: 在特定时刻,您需要固定某些限制,然后将它们与给定问题的限制进行比较。这就是指针——玩家携带的——所处的位置,这取决于它们在二维空间中的位置。
- 终止: 定义指针子程序中指针的终止规则。在这种情况下,最好有一种算法,可以同时完成两个指针,或者让其中一个指针到达数组或链表的末尾。
双指针技术的几个常见用例如下: - 查找对: 使用两个标记,可以查找序列中相加或相减得到特定和或组合的数字。
- 搜索子数组: 该操作提供了一种非常方便的方法来查找具有不同大小的序列部分,其和为某个值或序列的长度等于某个值。
- 删除重复项: 使用一个指针,该过程效率很高,因为扫描阶段通过递增一个指针来工作,同时删除已由另一个指针访问过的元素。• 检查回文:我们将确定字符串是否是回文(或不是)。
C 语言实现实现双指针技术的程序。 示例 1: 查找具有给定和的对 输出 说明 - 这里第一个函数是 **findPair**,它将确定两个输入数字是否与您提供的任何目标值相加。此函数设计为接受三个参数:arr = 输入数组已到位,仅包含整数,size = 数组大小,target = 我们要查找的对的和。知道此 getValue 函数中的指针,它会初始化内存区域。最初,左指针(left = 索引 0)和右指针(right = size - 1)将指向数组。
- 第二个循环开始,将一直重复,直到左指针小于右指针为止。存储在左指针和右指针处的元素的当前和被检索并存储在变量 currentSum 中,该变量用于调节此循环的结构。
- 现在,我们根据 currentSum 的值检查条件:
- 在这种情况下,如果我们确定 currentSum 的值等于我们的目标和,那么我们就意识到我们确实找到了一个和为特定目标值的对。这是一个函数完成任务并识别构成该对的元素(arr[left] 和 arr[right])的场景。
- 如果我们迄今为止的和小于目标,那么我们需要增加和,我们可以通过将左指针移动到数组的下一个索引(增加 left)来做到这一点。
- 如果 currentSum 大于目标,或者如果我们需要更少的元素,则右指针将减少一个位置(减小 right),并且 currentSum 不需要分配给它的另一个邻居(选择更少的元素)。
示例 2: 从排序数组中删除重复项 输出
Array after removing duplicates:
1 2 3 4 5
说明 - 在这种特定情况下,**removeDuplicates 函数接受两个参数:数组 arr[] 和数组的大小。
- 它确保数组的维度为 1 或更小。它返回相同重复记录的大小。
- 如果数组中至少有两个元素,则函数初始化两个指针:i,j。第一个数组项是 i 指针的末尾,j 是第二个项的开头。
- 循环遍历数组元素,从第二个元素(索引 1)开始,到最后一个元素结束。
- 在循环中,它将 j 位置的元素与 i 位置的元素进行比较。
- 如果元素不同,则递增循环 i,并将 j 处的元素赋值为 i 处的元素的值,从而删除重复项。
- 处理每个元素后,函数返回 i+1,这表示删除重复项后数组的新长度。
- main 函数定义了一个包含重复项的数组 arr[]。
- 使用 sizeof 运算符计算数组的大小。
- 调用 **removeDuplicates 函数从数组中删除重复项,并将大小存储在 size 变量中。
- 之后,将删除重复项的排序数组打印到控制台。
结论总之,C 语言中的双指针 技术是一种非常高效的算法,它花费大量时间在沿着数组或链表移动的两个指针上。该方法通过设置指针以匹配条件以及搜索孪生、删除重复数据等来完成。示例中的算法 1 设计用于使用对查找具有特定和的项,而示例 2 用于从排序数组中获取所有重复项。它通过跳过不必要的迭代,使代码可读,降低了时间复杂度,并以最佳方式消耗内存资源。
|