力扣算法经典第一题——两数之和(Java两种方式实现)

简介: 力扣算法经典第一题——两数之和(Java两种方式实现)

力扣算法经典第一题——两数之和(Java两种方式实现)


一、题目

难度:简单

给定一个整数数组 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]

三、简单分析

简单理解一下哈,力扣直接标记出简单,说实话,对于一个算法不太了解的人,确实不太明白。通过一些资料慢慢理解了。在这里分享给大家,主要是思路。

给我们一个数组,然后一个目标值。我们不用想要得到数组下标,肯定要进行便利数组,然后进行比较找出答案。

最简单的就是两个便利然后组合进行判断是否符合目标值,当然这样的效率也是比较慢,随着数组的越大,效率就会直线下降。这样的时间复杂度为O(n^2)。就和冒泡排序一样两个for进行挨个比较!

四、暴力便利

public static int[] twoSum1(int[] nums,int target) {
    for (int i = 0; i < nums.length; i++) {
        for (int j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] == target) {
                return new int[]{i, j};
            }
        }
    }
    return null;
}
public static void main(String[] args) {
  int nums[] = {2,4,6,7};
  int target = 10;
  int[] ints = twoSum1(nums, target);
  for (int i = 0;i < ints.length; i++){
      System.out.println(ints[i]);
  }
}

五、进阶HashMap实现

public int[] twoSum2(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int result = target - nums[i];
        if (map.containsKey(result)) {
            return new int[] { map.get(result), i };
        }
        map.put(nums[i], i);
    }
    return new int[]{};
}
public static void main(String[] args) {
  int nums[] = {2,4,6,7};
  int target = 6;
  int[] ints = twoSum2(nums, target);
  for (int i = 0;i < ints.length; i++){
      System.out.println(ints[i]);
  }
}

六、进阶分析

利用HashMap的containsKey()方法,哈希查找效率提升到O(n),遍历数组 nums,i为当前下标,每个值都判断map中是否存在 target-nums[i]的key值,每次都把没找到的放进集合里,以例子来说:

第一次便利2 6 - 2 = 4 ,判断map里没有4这个key,我们把i的值2放进map里key为值,value为下标。

第二次便利4 6 - 4 = 2,判断map,发现key有2,则直接返回结果作为key的map对应的value也就是0下标,第二个就是本次便利的i=4的下标1

依次放下进行继续遍历找到为止。

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
15天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
73 2
|
1月前
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
30 0
Leetcode第一题(两数之和)
|
1月前
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
15 0
|
1月前
|
算法 Java
LeetCode(一)Java
LeetCode(一)Java
|
1月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
1月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣