当前位置: 首页 > news >正文

力扣--两数之和(Java)

两数之和问题解法

思路讲解

我这个思路核心是“淘汰数组中值大于 target 的元素”,这基于一个优化假设:如果一个元素的值大于 target,那么它与另一个正数相加时,和可能会超过 target(尤其在元素非负的情况下)。因此,先过滤掉这些元素可以缩小搜索范围,减少不必要的比较。但需要注意,这个优化有局限性:

  • 淘汰值大于 target 的元素可能会导致遗漏有效解。因为如果数组元素可能为负,此优化可能不适用。
  • 为了确保正确性,在过滤后,我们使用双重循环在剩余元素中比较每对组合,寻找和为目标值的两个数。双重循环简单但效率较低,适用于数组较小或过滤后元素较少的情况。

算法步骤详细分解:

  1. 淘汰阶段:遍历原数组,创建一个新列表存储值小于或等于 target 的元素及其原始索引(因为淘汰元素会丢失索引信息)。
  2. 比较阶段:在过滤后的列表上,使用双重循环遍历所有元素对(确保索引不同),检查每对元素的和是否等于 target
  3. 返回结果:找到符合条件的两个元素后,立即返回它们的下标(假设只有一个有效答案)。
Java 代码实现

以下是完整的 Java 代码,实现了上述思路。代码包含详细注释以帮助理解。

import java.util.ArrayList;
import java.util.List;public class TwoSum {public int[] twoSum(int[] nums, int target) {// 步骤1: 淘汰值大于 target 的元素,存储剩余元素的索引和值List<ElementWithIndex> filteredList = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] <= target) {// 只添加值 <= target 的元素,保留原始索引filteredList.add(new ElementWithIndex(nums[i], i));}}// 步骤2: 在过滤后的列表中,使用双重循环比较每对元素for (int i = 0; i < filteredList.size(); i++) {for (int j = i + 1; j < filteredList.size(); j++) {// 获取元素值int num1 = filteredList.get(i).value;int num2 = filteredList.get(j).value;// 检查两个元素和是否等于 target,且索引不同if (num1 + num2 == target) {// 返回原始索引return new int[]{filteredList.get(i).index, filteredList.get(j).index};}}}// 如果没有找到,抛出异常(但题目保证有且只有一个答案)throw new IllegalArgumentException("No two sum solution");}// 辅助类:存储元素值及其原始索引private static class ElementWithIndex {int value;int index;ElementWithIndex(int value, int index) {this.value = value;this.index = index;}}// 测试示例public static void main(String[] args) {TwoSum solution = new TwoSum();// 示例 1int[] nums1 = {2, 7, 11, 15};int target1 = 9;int[] result1 = solution.twoSum(nums1, target1);System.out.println("输出: [" + result1[0] + ", " + result1[1] + "]"); // 预期 [0, 1]// 示例 2int[] nums2 = {3, 2, 4};int target2 = 6;int[] result2 = solution.twoSum(nums2, target2);System.out.println("输出: [" + result2[0] + ", " + result2[1] + "]"); // 预期 [1, 2]// 示例 3int[] nums3 = {3, 3};int target3 = 6;int[] result3 = solution.twoSum(nums3, target3);System.out.println("输出: [" + result3[0] + ", " + result3[1] + "]"); // 预期 [0, 1]}
}

代码说明
  • 淘汰阶段:使用一个 ArrayList 存储 ElementWithIndex 对象,每个对象包含元素值 value 和原始索引 index。只有值小于或等于 target 的元素被保留(即 nums[i] <= target)。
  • 比较阶段:双重循环遍历过滤后的列表,检查每对元素和是否等于 target。内层循环从 i+1 开始,避免使用相同元素和重复比较。
  • 辅助类ElementWithIndex 用于存储值和索引,确保在过滤后仍能访问原始下标。
  • 测试main 方法包含了您提供的三个示例,验证代码正确性。

这个是我目前认为一个比较简单容易理解的方法(还未开始学习数据结构),如果有什么可以改进的地方欢迎·评论区补充~!

http://www.dtcms.com/a/605119.html

相关文章:

  • wordpress翻译公司网站吕梁网站制作
  • Lanelet2 OSM数据格式详解
  • 分布式系统保证数据强一致性的示例
  • Spring Boot性能提升的核武器,速度提升500%!
  • SOLIDWORKS 2025设计效率的大幅提高
  • 比标准Json库好用——json-iterator
  • 汇编语言编译器的作用 | 探讨汇编编译器的工作原理和实际应用
  • C语言编译器下载地址与安装指南
  • kanass实战教程系列(4) - 产品经理如何使用kanass有效管理需求
  • RLS(递归最小二乘)算法详解
  • 红色好看的网站济南网络推广软件公司
  • mvcc 简介
  • UniApp 商品分类左右联动技术文档
  • pytest 入门指南:Python 测试框架从零到一(2025 实战版)
  • SpringBoot教程(三十三)| SpringBoot集成MinIO
  • 【开题答辩全过程】以 基于.NET MVC的线上鞋服交易系统设计与实现为例,包含答辩的问题和答案
  • MySQL 全体系深度解析(存储引擎、事务、日志、MVCC、锁、索引、执行计划、复制、调优)
  • SpringMVC基础教程(1)--MVC/DispathcerServlet
  • 在streampark运行paimon-flink-action-1.20.0.jar
  • AI得贤面试智能体:重构企业招聘新范式
  • 硅基计划6.0 陆 JavaEE HttpHttps协议
  • 稳定边界层高度参数化方案的回归建模
  • 企业网站推广方法wap网站预览
  • 可以做推广的门户网站wordpress适合中国的小插件介绍
  • Dubbo服务治理全解析:从零搭建高可用微服务架构
  • java List怎么转换为Vector
  • 2023年辽宁省数学建模竞赛-B题 数据驱动的水下导航适配区分类预测-基于支持向量机对水下导航适配区分类的研究
  • 机器学习--KNN算法中的距离、范数、正则化
  • openGauss向量数据库功能实操测评:轻量部署下的高维检索能力
  • php做网站还是linuxseo服务外包费用