[leetcode] 双指针集锦(python实现)

news/2024/6/28 18:12:39

在解题时,双指针的思想常常可以帮助我们优化解法的时间空间复杂度。接下来,我将通过两道LeetCode的题来给大家讲解双指针的使用方法。


文章目录

    • 题目1:Two Sum
    • 题目2:Three Sum
    • 双指针思想的总结

题目1:Two Sum

题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

解题思路:我们可以初始化两个指针分别指向数组的起始点和终点,如果两个指针所指的值之和大于target,则移动尾指针使得总和减小;如果两者相加小于target,则移动头指针使得总和增大。不断循环此过程,直到找到相加等于target的两个数,然后返回它们的下标。

代码实现

def twoSum(nums, target):
    nums = enumerate(nums)
    nums = sorted(nums, key=lambda x:x[1])
    l, r = 0, len(nums)-1
    while l < r:
        if nums[l][1]+nums[r][1] == target:
            return [nums[l][0], nums[r][0]]
        elif nums[l][1]+nums[r][1] < target:
            l += 1
        else:
            r -= 1

题目2:Three Sum

题目描述:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

解题思路:先将数组排序,然后遍历数组,对于每个元素,我们可以设置双指针分别指向该元素的后一位和数组的最后一位,如果三个数之和等于0,则记录下来;如果三个数之和小于0,则移动头指针;如果大于0,则移动尾指针。

代码实现

def threeSum(nums):
    nums.sort()
    res, k = [], 0
    for k in range(len(nums) - 2):
        if nums[k] > 0: break # 1.因为j>i>k, 所以如果nums[k] > 0那么后续不可能有三个数和为0
        if k > 0 and nums[k] == nums[k - 1]: continue # 2.避免出现重复结果
        i, j = k + 1, len(nums) - 1
        while i < j: # 3.双指针循环
            s = nums[k] + nums[i] + nums[j]
            if s < 0:
                i += 1
                while i < j and nums[i] == nums[i - 1]: i += 1 # 4.避免出现重复结果
            elif s > 0:
                j -= 1
                while i < j and nums[j] == nums[j + 1]: j -= 1 # 5.避免出现重复结果
            else:
                res.append([nums[k], nums[i], nums[j]])
                i += 1
                j -= 1
                while i < j and nums[i] == nums[i - 1]: i += 1 # 6.避免出现重复结果
                while i < j and nums[j] == nums[j + 1]: j -= 1 # 7.避免出现重复结果
    return res

双指针思想的总结

双指针是一种多用于解决数组/链表问题的简单却非常巧妙的思想。它的主要思路是用两个指针,一个快一个慢或者一个在前一个在后去遍历数据,帮我们降低时间复杂度,解决问题。它常常被应用于以下几种情况:

  • 两数之和/三数之和等问题:在已经排序的数组中用两个指针分别从头和尾向中间扫描,寻找满足条件的元素。
  • 链表中寻找中间节点或者是判断链表是否存在环等问题:通过一个快指针(一次移动两格)和一个慢指针(一次移动一格)在遍历的过程中找到解。
  • 归并排序中的合并操作:分别使用两个指针指向两个待归并的有序数组的头部,每次选取小的放入结果中,并移动选中的那个数组的指针。

使用双指针,我们可以在许多情况下将时间复杂度从原来的O(n^2)降低到O(n)。同时,双指针的理念也可以适用于多指针的情况,帮助我们解决更复杂的问题。在日常的编程实践中,我们可以多尝试和利用双指针的思想来解决问题。


http://lihuaxi.xjx100.cn/news/2215500.html

相关文章

当在Python环境中安装Jupyter Notebook时遇到失败的情况

当在Python环境中安装Jupyter Notebook时遇到失败的情况&#xff0c;可能是由于多种原因导致的&#xff0c;包括但不限于环境问题、网络问题、依赖项缺失或版本冲突等。以下将详细探讨这些可能的原因&#xff0c;并提供相应的解决方案&#xff0c;以帮助您成功安装Jupyter Note…

【AI原理解析】— 文心一言模型

目录 模型架构 Transformer模型 编码器-解码器结构 训练过程 预训练 微调 关键技术 知识增强 上下文感知 个性化生成 推理与生成 应用场景 问答系统 文本生成 对话系统 模型架构 Transformer模型 文心一言的核心架构采用了Transformer模型&#xff0c;该模型是一…

C语言 | Leetcode C语言题解之第151题反转字符串中的单词

题目&#xff1a; 题解&#xff1a; void myResverse(char* s,int start,int end){while(start<end){char temp s[start];s[start] s[end];s[end] temp;start;end--;} } char* reverseWords(char* s) {int start 0;int end strlen(s)-1;myResverse(s,start,end);if(s[…

Java17 --- SpringSecurity之自定义配置

目录 一、基于用户的内存认证 二、基于数据库用户认证 2.1、添加数据库 2.2、添加相关pom依赖 2.3、测试实现 三、添加用户 四、密码加密 五、 自定义登录页 一、基于用户的内存认证 Configuration //EnableWebSecurity //开启springSecurity自定义配置&#xff0…

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中&#xff0c;易分类的负样本占据主导地位的问题&#xff0c;从而导致模型难以…

LeetCode题练习与总结:最长连续序列--128

一、题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&…

linux下C语言如何操作文件(一)

本篇我们简单介绍一下在linux中如何使用C语言操作文件,首先我们在项目中创建file_util.c源文件和file_util.h头文件如图: 我们先编辑file_util.h文件,定义好常用的函数,源代码如下: #ifndef FILE_UTIL_INCLUDED #define FILE_UTIL_INCLUDED#include <stdbool.h> #i…

docker镜像拉取失败,K8s的calicoPod出现Init:ImagePullBackOff问题的解决

配置k8s集群出现问题 起初以为是版本问题&#xff0c;最后比对了一下发现没有问题。使用 kubectl describe calico-node-mg9xh -n kube-system命令查看发现docker pull 镜像失败&#xff0c;但是docker国内镜像源早就配置过了。 猜测Docker的缓存可能会导致拉取镜像失败。尝试…