【双指针-中等】167. 两数之和 II - 输入有序数组

本文介绍了一种使用双指针解决两数之和问题的高效算法。通过移动左右两个指针来查找目标值,适用于有序数组。文章提供了Python实现示例。

题目

【代码】
【方法1】双指针
设置left,right两个指针,当左右之和小于target的时候,移动左侧指针,当左右之和等于target的时候,返回,当左右之和大于target的时候,将右侧指针向左移动。
在这里插入图片描述

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left,right=0,len(numbers)-1
        while left<right:
            mid=left+(right-left)//2
            s=numbers[left]+numbers[right]
            if s<target:
                left+=1
            elif s==target:
                return [left+1,right+1]
            else:
                right-=1
        return []               
LeetCode 第 80 题“删除有序数组中的重复项 II”中,要求在原地修改输入数组,使每个元素最多出现两次,并返回新长度,且使用 O(1) 额外空间。该问题可以通过双指针或移动元素到末尾并缩减数组长度的方式来实现。 ### 双指针解法 该方法利用两个指针来遍历数组,其中一个指针用于记录当前应插入的位置,另一个指针用于遍历数组。由于数组是有序的,因此相同的元素会连续出现。我们可以通过判断当前元素是否与前两个位置的元素相同,来决定是否保留当前元素。 ```python def removeDuplicates(nums): if len(nums) <= 2: return len(nums) slow = 2 for fast in range(2, len(nums)): if nums[fast] != nums[slow - 2]: nums[slow] = nums[fast] slow += 1 return slow ``` 此方法的时间复杂度为 O(n),空间复杂度为 O(1),满足题目要求[^4]。 ### 移动元素到末尾并缩减长度 另一种方法是遍历数组,当发现某个元素出现超过两次时,将该元素逐步向后移动,并通过缩减数组长度的方式将其“删除”。这种方法虽然实现较为直观,但在时间效率上不如双指针方法[^3]。 ```python def removeDuplicates(nums): n = len(nums) if n <= 2: return n i = 0 while i < n - 2: if nums[i] == nums[i + 2]: # 将当前元素向后移动一位,直到移动到末尾 for j in range(i, n - 1): nums[j] = nums[j + 1] nums[n - 1] = nums[i] n -= 1 else: i += 1 return n ``` 这种方法的时间复杂度为 O(n^2),适用于数组长度较小的情况[^3]。 ### 总结 在 LeetCode 第 80 题中,双指针方法是最优解法,因为它在时间复杂度和空间复杂度上都达到了题目要求。相比之下,移动元素的方法虽然也能解决问题,但其时间效率较低。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值