面试经常会遇到算法题目,今天开启算法专栏,常用算法解析
**
**
你可以按任意顺序返回答案。
示例 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]
遍历for循环比较 nums[j] == target - nums[i]
/**
*
* @param nums
* @param target
* @return
*/
public static int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[]{i, j};
}
}
}
return new int[]{}; // 没有找到符合条件的元素
}
思考一下有更好的解法吗?
当前时间复杂度为 O(N^2)
可以通过hash存入Key=value,value=索引的方式存储比较
关键代码
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{(int) map.get(complement), i};
}
/**
* 在整数数组中找到两个数,它们的和等于给定的目标值
* 算法优化 O(n) 复杂度
*
* @param nums 整数数组
* @param target 目标值
* @return 包含两个数索引的整数数组,如果没有找到则返回空数组
*/
public static int[] optimizedTwoSum(int[] nums, int target) {
HashMap<Object, Object> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{(int) map.get(complement), i};
} else {
map.put(nums[i], i);
}
}
return new int[]{}; // 没有找到符合条件的元素
}
上面写完,还有一些细节需要补充
/**
* 内存优化
* @param nums
* @param target
* @return
*/
public static int[] optimizedTwoSum2(int[] nums, int target) {
int length = nums.length;
// 初始化哈希表
Map<Integer, Integer> map = new HashMap<>(length-1);
map.put(nums[0], 0);
for (int i = 1; i < length; i++) {
int c = target - nums[i];
if (map.containsKey(c)) {
return new int[]{(int) map.get(c), i};
} else {
map.put(nums[i], i);
}
}
throw new IllegalArgumentException("No two sum solution");
}
执行结果
因篇幅问题不能全部显示,请点此查看更多更全内容