Java【手撕双指针】LeetCode 57. “两数之和“, 图文详解思路分析 + 代码

本文介绍了如何使用双指针技巧高效解决Java中的两数之和问题,利用数组的单调性,通过对撞双指针排除无效组合,以O(n)的时间复杂度找到满足条件的数对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

一、两数之和

1, 题目

OJ链接

题目给定的数组保证有序, 并且需求是查找

  • 查找的本质是排除 ! ! 查找的本质是排除 ! ! 查找的本质是排除 ! !

  • 有序的数组成单调性, 能很方便的使用双指针


2, 思路分析

最简单的暴力枚举 : 两层 for 循环, 从先固定一个数, 再依次遍历第二个数, 判断这两个数的和是否为 targer(目标值), 时间复杂度为O(N²), 会超出时间限制

既然暴力枚举不行, 那有没有效率更高的解法呢? 由于题中数组是升序的, 可以利用这个 “单调性” 的特点, 尝试就使用双指针

根据实际情况分析选择对撞双指针还是快慢双指针, 本题要求在数组中"查找", 那么使用对撞双指针能很大程度上提高效率

而且刚才标注了一句话 : 查找的本质是排除, 查找的本质是排除, 查找的本质是排除 ! ! !

如果每次判断, 都能尽可能多的排除数据, 就能尽可能地提高效率

解题步骤 :

  • 定义 left 指针在 0 下标, 定义 right 指针在 nums.length - 1 下标
  • left 的值 + right 的值, 和 target 比较
  • 如果二者之和等于 target , 即为所求
  • 如果二者之和大于 targer, 令 right-- (这一步就是在排除)
  • 如果二者之和小于 targret, 令 left++ (这一步就是在排除)

在这里插入图片描述

如何理解利用数组单调性, 双指针能够高效的排除 ?
在这里插入图片描述
如果数组不是单调的, 不能保证 10 后面的数一定比 10 大, 就不能排除了


3, 代码展示

	 public int[] twoSum(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while(left < right) {
            if(nums[left] + nums[right] > target) {
                right--;
            }else if(nums[left] + nums[right] < target){
                left++;
            }else {
                return new int[]{nums[left],nums[right]};
            }
        }
        return nums;
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵魂相契的树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值