用双指针法求解和为S的两个数字问题

本文介绍了一种使用双指针法解决数组中寻找两个数使其和为特定值的问题。通过利用数组已排序的特点,从两端开始向中间逼近,有效提高了查找效率。文章详细解释了算法步骤,并提供了C#实现代码。

在这里插入图片描述
这题可以用暴力法,直接遍历求解,但是双指针法更巧妙:

因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
2. 如果arr[i] + arr[j] == sum , 说明是可能解
3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以–j
4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i
代码如下:

using System.Collections.Generic;
class Solution
{
    public List<int> FindNumbersWithSum(int[] array, int sum)
    {
        List<int> ret=new List<int>();
        int left=0;
        int right=array.Length-1;
        int minleft=9999;
        int minright=9999;
        bool isExist=false;
        while(left<right)
        {
            if(array[left]+array[right]==sum)
            {
                isExist=true;
                if(array[left]*array[right]<minleft+minright)
                {
                    minleft=array[left];
                    minright=array[right];
                }
                right--;
                left++;
            }
            else
            {
                if(array[left]+array[right]>sum)
                {
                    right--;
                }
                if(array[left]+array[right]<sum)
                {
                    left++;
                }
            }
        }
        if(isExist)
        {
            ret.Add(minleft);
            ret.Add(minright);
        }
        return ret;
    }
}
### Python 中双指针法的实现与应用 #### 基本概念 双指针算法涉及使用两个指针(索引或引用),通常分别称为“快指针“慢指针”或“左指针“右指针”,以协同进行遍历或搜索。该算法的核心思想是通过移动这两个指针来实现特定目标,例如寻找一对元素的、判断是否存在某种关系或在特定条件下移动其中一个指针[^1]。 #### 应用场景 双指针主要应用于有序数组中,设置两个指针,以一前一后或者一快一慢的方式对数组元素进行检索或数据修改。这种方法能够有效降低时间复杂度,提高效率[^3]。 #### 对撞指针模式 对撞指针是一种常见的双指针应用场景,适用于决两数之问题。初始时,一个指针指向数组起始位置,另一个指针指向数组末尾。根据具体需求调整指针的位置直到找到满足条件的结果为止。 ##### 对撞指针求解步骤 1. 初始化左右指针分别为数组的第一个最后一个元素; 2. 计算当前指针对应数值之间的差值并与目标值比较; 3. 如果小于目标,则增加左侧指针;如果大于目标则减少右侧指针; 4. 当发现匹配项时返回结果,否则继续循环直至结束。 ##### 对撞指针伪代码模板 ```python def two_sum(nums, target): left, right = 0, len(nums) - 1 while left < right: current_sum = nums[left] + nums[right] if current_sum == target: return (left, right) elif current_sum < target: left += 1 else: right -= 1 return None ``` #### 删除重复项案例分析 对于给定的一个升序排列列表 `nums=[1,1,1,2,2,3]` ,要删除多余的重复项并保留最多两次出现次数的不同整数。可以通过定义两个指针来进行操作: - 定义 `slow=2`, 表示新序列的有效长度起点; - 使用 `fast=2` 遍历整个原数组; - 若遇到不相同的元素就将其赋值到 `slow` 所指示的位置,并使 `slow` 向前进一位; 最终得到的新数组即为去重后的版本[^5]。 ```python from typing import List class Solution: def removeDuplicates(self, nums: List[int]) -> int: slow = 2 fast = 2 while fast < len(nums): if nums[slow - 2] != nums[fast]: nums[slow] = nums[fast] slow += 1 fast += 1 return slow ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值