思路:
1.暴力解法(哈希表)
遍历数组将元素存入哈希表,第二次遍历数组,对每一个元素在哈希表中寻找符合条件的另一个元素。
时间复杂度O(n),空间复杂度O(n)
class Solution { public int[] twoSum(int[] nums, int target) { HashSet<Integer> set = new HashSet<>(); for(int i : nums){ set.add(i); } for(int i : nums){ int ans = target - i; if(set.contains(ans)){ return new int[]{i,ans}; } } return new int[]{}; } }
2. 双指针(利用题干里递增数组条件)
双指针 i,j 分别指向数组两端,向另一端移动,记 sum = nums[i]+nums[j]。
若sum=target,返回数组 [nums[i] ,nums[j]];
若sum<target,左指针 i 向右移动,即 i++;
若sum>target,右指针 j 向左移动,即 j--。 否则返回空数组。
时间复杂度O(n),空间复杂度O(1)
class Solution { public int[] twoSum(int[] nums, int target) { int i = 0, j = nums.length - 1; while(i < j) { int s = nums[i] + nums[j]; if(s < target) i++; else if(s > target) j--; else return new int[] { nums[i], nums[j] }; } return new int[0]; } }