本身是没有什么难度的题目,但是可以用于开拓思路。
解法1
没有技术含量,LeetCode上面没有对边界值和特殊情况做处理,比如
- nums数组中存在重复数据
- nums数组元素小于2的情况
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
// 确保数组长度要大于等于2
if (nums.length < 2)
return new int[]{-1,-1};
// 确保目标值要小于int的最大范围
if (target > Integer.MAX_VALUE)
return new int[]{-1,-1};
for (int i = 0; i < nums.length; i++ ) {
int j = i + 1;
while(j < nums.length) {
if ((nums[i] + nums[j]) == target) {
result[0] = i;
result[1] = j;
break;
}
j++;
}
}
return result;
}
第一种解法的时间复杂度是O(n2),空间复杂度是O(1)
第一种解法的时间复杂度主要是来自于双层循环,也就是数据遍历。于是引申出另外一种解法。使用可以快速找到元素的数据结构 Map
解法2
字典方法,空间换时间
public int[] twoSumMap(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>(nums.length);
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
return new int[]{map.get(target - nums[i]), i};
}
map.put(nums[i], i);
}
return new int[2];
}
时间复杂度为O(n),空间复杂度为O(n)
总结
当遇到寻找特定数据的情况下,可以考虑利用 Map
的特性快速寻找,减少时间复杂度。典型的空间换时间思路。
Q.E.D.