给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
仅自己复习刷题记录
1. 暴力求解法
package two_sum;
import java.util.Arrays;
/**
* @auther SQ
*/
public class solution01 {
public static void main(String[] args) {
int[] ints = twoSum(new int[]{1, 2, 3, 3, 5}, 5);
System.out.println(Arrays.toString(ints));
}
/**
* 暴力求解法: 双层for循环遍历
*
* 时间复杂度 双层循环遍历n*n次 所以O(N*N)
* 空间复杂度 空间复杂度是一个算法在运行过程中,临时占用存储空间大小的度量
* 空间复杂度 O(1) 只用到了常数个变量
* @param ints
* @param target
* @return
*/
public static int[] twoSum(int[] ints, int target) {
int length = ints.length;
for (int i = 0; i < length - 1; i++) {
for (int j = i + 1; j < length; j++) {
if (ints[i] + ints[j] == target) {
return new int[]{i, j};
}
}
}
throw new IllegalArgumentException("NO TWO SUM SOLUTION!");
}
}
2. 哈希表查找
package two_sum;
import java.util.Arrays;
import java.util.HashMap;
/**
* @auther SQ
*/
public class solution02 {
public static void main(String[] args) {
int[] ints = twoSum(new int[]{1, 2, 3, 3, 5}, 5);
System.out.println(Arrays.toString(ints));
}
/**
* 查找法表
* hash表查找
*/
public static int[] twoSum(int[] ints, int target) {
int length = ints.length;
HashMap<Integer, Integer> map = new HashMap<>(length - 1);
for (int i = 0; i < length; i++) {
map.put(ints[i], i); /*没进行判断,直接进行put*/
if (map.containsKey(target - ints[i])) {
return new int[]{i, map.get(target - ints[i])};
}
}
throw new IllegalArgumentException("NO TWO SUM SOLUTION!");
}
}
牺牲空间换时间,增加变量,导致增加内存空间的占用,但是减少了时间复杂度,运行时间减少。
3. Leetcode的解法
package two_sum;
import java.util.Arrays;
import java.util.HashMap;
/**
* @auther SQ
*/
public class solution03 {
public static void main(String[] args) {
int[] ints = twoSum(new int[]{1, 2, 3, 3, 5}, 5);
System.out.println(Arrays.toString(ints));
}
public static int[] twoSum(int[] ints, int target) {
int len = ints.length;
/**
给hashMap初始化容量,不然默认初始化容量为15
*/
HashMap<Integer, Integer> map = new HashMap<>(len - 1);
map.put(ints[0], 0); // 将索引置为value,值置为key
for (int i = 1; i < len; i++) {
int another = target - ints[i];
if (map.containsKey(another)) {
return new int[]{map.get(another), i};
}
map.put(ints[i], i);
}
throw new IllegalArgumentException("NO TWO SUM SOLUTION!");
}
}