2021-08-07 LeetCode(力扣)算法入门 第3天|双指针

本文探讨了如何利用双指针技巧解决数组中的问题,如移动零元素到数组末尾和寻找有序数组中两数之和等于目标值的下标。通过比较不同解决方案的时间复杂度,展示了高效算法的重要性。官方题解和社区中的优秀解答提供了不同的思路,包括原地修改数组和排序等方法。
摘要由CSDN通过智能技术生成


在这里插入图片描述

283. 移动零

数组双指针

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

  • 第一次提交
    在这里插入图片描述
    136ms
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in nums:
            if i==0:
                nums.remove(i)
                nums.append(0)
        return nums
  • 第二次看评论区大神
    在这里插入图片描述
    32ms
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        return nums.sort(key=bool, reverse=True)
  • 官方题解
    在这里插入图片描述
    36ms
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        slow = fast = 0
        while fast < len(nums):
            if nums[fast] != 0:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        for i in range(slow, len(nums)): nums[i] = 0

167. 两数之和 II - 输入有序数组

数组双指针二分查找

给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]

1.常规解法

  • [ X ] 超时代码
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        s_index=[]
        for i in numbers:
            for j in numbers:
                if target==i+j:
                    if j>i:
                        s_index.append(numbers.index(i)+1)
                        s_index.append(numbers.index(j)+1)
                    if j==i:
                        s_index.append(numbers.index(i)+1)
                        s_index.append(numbers.index(j)+2)
        return s_index[:2]

在这里插入图片描述
在控制台测试用例没问题,但提交代码后执行的最后一个代码超时
在这里插入图片描述
2.二分法

二分法前提`:是顺序列表,本题是升序列表

  1. 左右两数相加满足则直接输出
  2. 左右相加大于目标,右边数较大,依次减一
  3. 左右相加小于目标,左边数较小,依次加一
  4. 条件2和3最终要满足条件1
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        left=0
        right=len(numbers)-1
        while right > left:
            if numbers[left] + numbers[right]==target:
                return [left+1,right+1]
            elif numbers[left] + numbers[right] > target:
                right-=1
            else:
                left+=1

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值