LeetCode第一题,两数之和
因为是第一题所以热度比较高,有很多种解法
给定一个整数数组 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) 的算法吗?
思路一
暴力循环
双重循环,更新i 和 j 时要注意 j 的范围一定比 i 的范围小
class Solution {public int[] twoSum(int[] nums, int target) {//定义一个整数n为数组长度int n = nums.length;//双重循环暴力解法for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){if(nums[i] + nums[j] == target){//返回一个由两个整数元素组成的数组,这两个元素分别是i和j的值return new int[]{i, j};}}}return null;}
}
可以使用不同的方法来创建数组。以下是几种常用的方法,
- 使用数组字面量初始化数组:
int[] array = {1, 2, 3, 4, 5};
这种方式通过在大括号中列出元素的值来定义并初始化数组。编译器会根据提供的初始值自动推断数组的长度。
- 使用
new
关键字创建数组并指定长度:
int[] array = new int[5];
这种方式使用new
关键字创建一个指定长度的数组,并将其赋值给变量。在上述示例中,创建了一个长度为5的int
类型数组。
- 使用
new
关键字创建多维数组:
int[][] matrix = new int[3][3];
这种方式可以创建多维数组,例如二维数组。在上述示例中,创建了一个3x3的二维int
数组。
- 使用
Array.newInstance()
方法创建数组:
int[] array = (int[]) Array.newInstance(int.class, 5);
这种方式使用Array.newInstance()
方法创建数组,并指定数组的类型和长度。上述示例中,创建了一个长度为5的int
类型数组。
当涉及到 Array
类时,需要注意在 Java 中,Array
是一个类用于表示数组,它提供了一些静态方法用于操作和处理数组。
以下是 Array
类的一些常用方法:
Array.getLength(Object array)
: 返回指定数组对象的长度。Array.get(Object array, int index)
: 返回指定数组对象中索引位置的元素。Array.set(Object array, int index, Object value)
: 将指定数组对象中索引位置的元素设置为指定的值。Array.copyOf(Object[] original, int newLength)
: 创建一个新数组,将原始数组中的元素复制到新数组中,并指定新数组的长度。Array.copyOfRange(Object[] original, int from, int to)
: 创建一个新数组,将原始数组中指定范围的元素复制到新数组中。Array.fill(Object[] array, Object value)
: 将指定数组中的所有元素设置为指定的值。
思路二 哈希表
新建一个哈希表
对于每一个x,首先查询哈希表中是否存在target - x
然后将x插入到哈希表中(防止自己被自己匹配)
class Solution {public int[] twoSum(int[] nums, int target) {//HashMap<Integer, Integer>() 创建了一个新的 HashMap 实例,并将其赋值给 hashtable 变量。Map<Integer, Integer> hashTable = new HashMap<Integer, Integer>();for(int i = 0; i < nums.length; i++){//如果hashtable中存在键(target - nums[i])//返回新建数组索引分别为target-nums[i] 和 iif(hashTable.containsKey(target - nums[i])){return new int[]{hashTable.get(target - nums[i]), i};}//如果不存在键(target - nums[i])//在hashTable中加入nums[i]和其索引hashTable.put(nums[i], i);}return new int[0];}
}
return new int[]{hashtable.get(complement), i}
这行代码创建一个新的整型数组,并使用大括号 {} 初始化数组的元素。数组中有两个元素,分别是 hashtable.get(complement) 和 i。
hashtable.get(complement)
表示从哈希表 hashtable 中获取键为 complement 的值。在这个代码示例中,complement 是目标值与当前元素差值,即 target - nums[i]。因为哈希表中存储的是数组元素及其索引的映射关系,所以 hashtable.get(complement) 返回的是差值所对应的索引。
i 是当前元素的索引,表示数组的第 i 个元素。
因此,这行代码的作用是返回一个新的整型数组,数组的第一个元素是差值所对应的索引,第二个元素是当前元素的索引。这样可以找到满足条件的两个数在原始数组中的索引位置。
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>()
这行代码声明了一个名为 hashtable 的变量,其类型为 Map<Integer, Integer>,表示这是一个将整数类型键映射到整数类型值的哈希表。
HashMap<Integer, Integer>() 创建了一个新的 HashMap 实例,并将其赋值给 hashtable 变量。HashMap 是 Java 中的一个哈希表实现,它通过哈希函数将键映射到存储桶,以提供高效的键值对访问。