力扣算法第1题--两数之和(暴力题解&优化题解)

两数之和

题目描述:

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力题解

 

public class Solution {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
  public int[] twoSum(int[] nums, int target) {
    int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中

 

    for(int i=0;i<nums.length;i++){
      for(int j=i+1;j<nums.length;j++){
        if(nums[i]+nums[j]==target){
          index1=i;
          index2=j;
          break;
        }
      }
    }

 

    int[] ans = { index1, index2 };
    return ans;
  }
}

  此常规算法运用两层for循环嵌套遍历,时间复杂度为O(n^2);

  此常规算法中定义了index1和index2两个变量,而数组是通过形参传入,所以空间复杂度为O(1)。

 

优化题解(思路来自我的算法课程老师)

 

import java.util.HashMap;

 

public class SolutionPlus {
/**
* 两数之和,在数组中找到两个数,使得它们的和等于target,返回这两个数的下标(存于数组中返回)
*/
  public int[] twoSum(int[] nums, int target) {
    int index1 = -1, index2 = -1; // 可将答案1和答案2存在这两个变量中

    //维护一个哈希表
    int value=0;
    HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
    for(int i=0;i<nums.length;i++){
      value=nums[i];//下标i数值a
      if(map.containsKey(target-value)){
        //map.put(nums[i],i);
        index1=i;//map.get(value)//只通过1个例子(第一版写的时候)
        index2=map.get(target-value);
        break;
      }
      else if(!map.containsKey(target-value)){
        map.put(nums[i],i);
      }
    }
    if(nums==null) return new int[0];
    int[] ans = { index1, index2 };
    return ans;
  }
}

  此优化算法用了一层for循环将数组元素加进哈希表map,再配合哈希表查询时花费O(1)的时间复杂度,使得优化算法的时间复杂度为O(n);

  此优化算法除了定义了index1和index2两个变量外,还定义了一个哈希表,哈希表的长度由形参传入的数组来决定,此处可理解其长度为n,所以优化算法的空间复杂度为O(n)。

 

思考:为什么优化算法的时间复杂度可以比常规解法更快?

 

  避免了两层循环嵌套的比对查询,哈希表是根据键而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度理论上哈希表的时间效率为常数级别,即O(1)

 

  每当在数组中找到一个数a,便把a作为key及其对应下标作为value存进哈希表当我们检索到b时,也能快速地从哈希表中查到a = target - b是否存在。这样我们只需要遍历一次数组。

 

--------------------------------------本文章的题解均为本人作答,无抄袭,题目来源于力扣平台。----------------------------------------

 

posted @   林同学的博客  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示