美文网首页
面试题57_I_和为s的数字

面试题57_I_和为s的数字

作者: shenghaishxt | 来源:发表于2020-02-19 11:34 被阅读0次

题目描述

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

题解一

第一种是暴力法,双重循环寻找和为target的两个数。

时间复杂度为O(n^2),空间复杂度为O(1)

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[i]+nums[j] == target) {
                    return new int[] {nums[i], nums[j]};
                }
            }
        }
        return new int[] {};
    }
}

题解二

遍历一遍数组,建立一个集合用于存储已遍历的数字。如果target减去当前数字的值不在集合中,就将当前数字存入集合中;如果对应值在集合中,就返回结果。

时间复杂度为O(n),空间复杂度为O(n)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (!set.contains(target-num)) {
                set.add(num);
            } else return new int[] {target-num, num};
        }
        return new int[] {};
    }
}

题解三

由于数组已经排序,所以可以用类似夹逼的思想,用双指针实现。

  • 如果left+right的值小于sum,说明要找的数字在right左边,right--;
  • 如果left+right的值大于sum,说明要找的数字在left右边,left++;
  • 如果left+right的值等于sum,则找到结果。

时间复杂度为O(n),空间复杂度为O(1)

下面是参考代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left = 0, right = nums.length-1;
        while (left < right) {
            if (nums[left] + nums[right] < target)
                left++;
            else if (nums[left] + nums[right] > target)
                right--;
            else {
                return new int[] {nums[left], nums[right]};
            }
        }
        return new int[] {};
    }
}

相关文章

  • 面试题57_I_和为s的数字

    题目描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,...

  • 面试题57:和为s的数字

    题目一:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输...

  • 和为 s 的数字

    和为 k 的两个数字一个递增排序的数组,在其中查找两个数使得其和 k。如果有多组,输出任意一对即可。思路:可以简单...

  • 面试题57(1):和为s的数字

    题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输...

  • 剑指offer第二版-57.和为s的数字

    本系列导航:剑指offer(第二版)java实现导航帖 面试题57:和为s的数字 题目要求:输入一个递增排序的数组...

  • 面试题57(剑指offer)--和为s的数字

    题目一: 和为 S 的两个数字。输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果...

  • 面试题57.1:和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,...

  • LeetCode | 面试题 57 - Ⅱ. 和为s的连续正数序

    LeetCode 面试题 57 - Ⅱ. 和为s的连续正数序列【Easy】【Python】【滑窗】【数学】 问题...

  • 41、和为s的两个数字VS和为s的连续正数序列

    和为s的两个数字 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和...

  • 57-从连续的正数序列中找出两数, 和为s

    和为s的两个数字.输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和...

网友评论

      本文标题:面试题57_I_和为s的数字

      本文链接:https://www.haomeiwen.com/subject/zwewfhtx.html