解法一:暴力法
暴力法很简单,遍历每个元素 x,并查找是否存在一个值与 target - x相等的目标元素。
class Solution { public 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 }; //函数返回值是数组类型,因此这里要返回一个数组 } } } throw new IllegalArgumentException("No two sum solution"); } }
提交结果:
复杂度分析:
时间复杂度:O(n^2),
对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)空间复杂度:O(1)。
方法二:遍历哈希表
若a + b = c,则 c - a = b。所以只需记录所有遍历过的数是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
class Solution { public int[] twoSum(int[] nums, int target) { int[] arr = new int[2]; // 记录遍历过的数和索引 Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { Integer flag = map.get(target - nums[i]); // 获取target-nums[i],看是否存在,存在则表明可以相加为target,并将其保存到数组 if (flag != null) { arr[0] = flag; arr[1] = i; break; } // 用键保存遍历过的数,用值保存遍历过的索引 map.put(nums[i], i); } return arr; } }
提交结果:
复杂度分析:
时间复杂度:O(n),
我们只遍历了包含有 n 个元素的列表一次。在表中进行的每次查找只花费 O(1) 的时间。空间复杂度:O(n),
所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 n 个元素。