剑指 Offer 57. 和为s的两个数字

 

思路:

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];
    }
}
posted @ 2021-02-16 17:46  zjcfrancis  阅读(38)  评论(0编辑  收藏  举报