NOTE

和为S的两个数字

记录《剑指 Offer》“和为S的两个数字”的原始解题笔记。

Data Structures & Algorithms创建于 更新于 约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

2. 思路

  • 双指针:由于数组有序,那么左右两个指针,一个指向第一个(右移),另一个指向最后一个(左移)

3. 实现

  • java
public class 和为S的两个数字
{
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum)
    {
        ArrayList<Integer> res = new ArrayList<>();
        //检查参数
        if (array == null || array.length == 0)
        {
            return res;
        }
        //两个指针一个指向第一个元素,另一个指向最后一个元素,求和。
        int left = 0;
        int right = array.length - 1;
        while (left < right)
        {
            int currentSum = array[left] + array[right];
            if (currentSum == sum)
            {
                res.add(array[left]);
                res.add(array[right]);
                return res;
            }
            //如果比sum大,那么第二个指针左移;

            else if (currentSum > sum)
            {
                right--;
            }
            //如果比sum小,那么第一个指针右移
            else
            {
                left++;
            }

        }

        return res;
    }
}
  • go
//时间复杂度:O(n)
//空间复杂度:O(1)
func FindNumbersWithSum(array []int, sum int) []int {
	if len(array) == 0 {
		return nil
	}

	left := 0
	right := len(array) - 1
	data := make([]int, 2)
	for left < right {
		currentSum := array[left] + array[right]
		if currentSum == sum {
			data[0] = array[left]
			data[1] = array[right]
			return data
		} else if currentSum < sum {
			left++
		} else {
			right--
		}
	}

	return nil
}
func twoSum(nums []int, target int) []int {
    left := 0
    right := len(nums)-1
    for left < right {
        sum := nums[left] + nums[right]
        if sum == target {
            return []int{nums[left], nums[right]}
        } else if sum < target {
            left++
        } else {
            right--
        }
    }
    return []int{-1,-1}
}

4. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看