首页 > 其他 > 详细

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

时间:2021-02-16 23:34:12      阅读:37      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

思路:

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];
    }
}

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

原文:https://www.cnblogs.com/zccfrancis/p/14407060.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!