Leetcode 每日一题 167 .两数之和

devtools/2024/11/24 4:24:50/

目录

引言

问题背景

输入输出规范

输入

输出

示例解析

示例 1

示例 2

示例 3

算法策略

Java代码实现

复杂度分析

结语


引言

算法的世界里,有些问题虽然简单,但却是锻炼算法思维的绝佳练习。今天,我们将深入探讨一个在面试中经常出现的问题——两数之和。这个问题不仅考验我们对数组操作的熟练程度,还考察我们如何利用数组的特性来优化算法。本文将详细介绍如何使用双指针法解决两数之和问题,并提供Java语言的实现。

问题背景

给定一个整数数组 numbers,该数组已经按照非递减顺序排列,以及一个目标整数 target。我们的任务是从数组中找出两个数,使得它们的和等于 target,并返回这两个数的下标(下标从 1 开始)。

输入输出规范

输入

  • 整数数组 numbers:一个已经排序的整数数组。
  • 整数 target:目标和。

输出

  • 整数数组 [index1, index2]:一个长度为 2 的数组,表示满足条件的两个数的下标。

示例解析

示例 1

输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 + 7 = 9,因此返回下标 12

示例 2

输入:numbers = [2,3,4], target = 6 输出:[1,3] 解释:2 + 4 = 6,因此返回下标 13

示例 3

输入:numbers = [-1,0], target = -1 输出:[1,2] 解释:-1 + 0 = -1,因此返回下标 12

算法策略

双指针法是解决此类问题的常用策略。我们利用数组的有序性,通过两个指针 leftright 分别指向数组的两端,通过调整这两个指针的位置来寻找满足条件的两个数。

  1. 初始化left 指向数组的开始,right 指向数组的末尾。
  2. 计算和:计算 numbers[left] 和 numbers[right] 的和。
  3. 调整指针
    • 如果和大于 target,则 right 向左移动,因为我们需要一个更小的数来减小总和。
    • 如果和小于 target,则 left 向右移动,因为我们需要一个更大的数来增加总和。
    • 如果和等于 target,则找到了满足条件的两个数,返回它们的下标。
  4. 循环直至相遇:重复上述步骤,直到 left 和 right 相遇。

Java代码实现

 

java

public class Solution {public int[] twoSum(int[] numbers, int target) {int[] indices = {-1, -1}; // 用于存储结果的数组,初始化为-1表示未找到int left = 0, right = numbers.length - 1; // 初始化左右指针while (left < right) { // 循环直至左右指针相遇int sum = numbers[left] + numbers[right];if (sum == target) {indices[0] = left + 1; // 记录下标indices[1] = right + 1;break; // 找到结果后跳出循环} else if (sum < target) {left++; // 增加总和} else {right--; // 减小总和}}return indices; // 返回结果}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 numbers 的长度。每个元素最多被访问两次。
  • 空间复杂度:O(1),只需要常量级的额外空间来存储结果。

结语

通过双指针法,我们不仅解决了两数之和问题,还展示了如何利用数组的有序性来优化算法。这种方法的时间复杂度和空间复杂度都非常低,适用于处理大规模数据集。希望这篇文章能够帮助你深入理解双指针法,并将其应用到实际问题中。如果你有任何疑问或想要进一步探讨,欢迎在评论区交流。同时,如果你觉得这篇文章对你有帮助,不妨点个赞或者分享给需要的朋友。让我们一起进步,一起成长!


编辑注:本文旨在提供一个清晰、简洁且易于理解的解决方案,帮助读者掌握双指针法在解决实际问题中的应用。如果你有任何建议或反馈,欢迎在评论区提出,我们将不断优化内容,以提供更高质量的技术文章。


http://www.ppmy.cn/devtools/136452.html

相关文章

Zabbix:使用CentOS 9,基于LNMP平台,源码部署Zabbix 7。

ZBX&#xff1a;源码部署Zabbix 7 一、Zabbix概述1. 什么是zabbix2. 为什么学习zabbix3. 逻辑架构3. 实验环境4. 软件下载&#xff1a; 二、安装前的系统准备工作1. 配置主机名2. 关闭防火墙3. 关闭selinux4. 配置yum源5. 配置时钟同步6. 优化系统限制7. 安装JDK 三、部署LNMP环…

猎板科技:PCB 特殊定制领域的卓越引领者

一、专业团队&#xff0c;创新设计之源 猎板科技的核心竞争力首先源于其卓越的专业团队。这支队伍汇聚了经验丰富的资深工程师以及行业前沿的技术专家&#xff0c;他们在 PCB 设计领域拥有深厚的造诣和敏锐的洞察力。无论是面对常规 PCB 设计任务&#xff0c;还是应对极具挑战…

SpringBoot学习记录(六)配置文件参数化

SpringBoot学习记录&#xff08;六&#xff09;配置文件参数化 一、参数提取到配置文件中二、yml配置文件三、ConfigurationProperties注解实现批量属性注入 一、参数提取到配置文件中 定义在代码中的参数的值分散在各个不同的文件中&#xff0c;不便于后期维护管理&#xff0…

浅谈vue3 和 vue2的区别

vue3中不再导出一个Vue的构造函数&#xff0c;而是具名导出很多数据不给用户提供Vue构造函数来创建vue实例&#xff0c;使用一个具名导出的createApp&#xff0c;然后传入一个根组件来创建&#xff0c;然后返回一个类似于vue实例的对象&#xff0c;调用mount方法来实现挂载组件…

使用 vscode 调试 nodejs 代码

继前一篇&#xff1a;使用 cmake.js 在 Windows 上编译 js 代码 我们已经能在 vscode 上成功的编译出 js 代码&#xff0c;那我们该如何断点调试 js 代码以及 js 引用的 C 库源码呢 首先要先以 Debug 模式编译 js 代码 cmake-js clean cmake-js compile -D找到 debug 生成的 pd…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…

杰发科技AC7801——ADC定时器触发的简单使用

使用场景 在需要多次采样结果的情况下&#xff0c;比如1s需要10w次的采样结果&#xff0c;可以考虑使用定时器触发采样&#xff0c;定时器设置多少的时间就会多久采样转换一次。 再加上使用dma&#xff0c;采样的结果直接放在dma的数组里面。 实现了自动采样&#xff0c;自动…

移动语义和拷贝语义的区别以及智能指针

移动语义和拷贝语义的区别 一、概念本质: 拷贝语义 拷贝语义是基于对象的复制操作。当一个对象被拷贝时&#xff0c;会创建一个新的对象&#xff0c;这个新对象的内容是原始对象的完全副本&#xff0c;这意味着新对象和原始对象在内存中有独立的存储空间&#xff0c;并且它们…