剑指offer最优解Java版-和为S的两个数字

题目描述

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

解决方法

两个数和相等时,差值越大,乘积越小

public class Solution {
    public static ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
        int start = 0;
        int end = array.length - 1;
        ArrayList<Integer> result = new ArrayList<>();
        while (start < end) {
            if (array[start] + array[end] == sum) {
                result.add(array[start]);
                result.add(array[end]);
                break;
            }
            while (start < end && (array[start] + array[end]) < sum)
                start++;
            while (start < end && (array[start] + array[end]) > sum)
                end--;
        }
        return result;
    }
}

复杂度分析:

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。
哎呀,如果我的名片丢了。微信搜索“全菜工程师小辉”,依然可以找到我
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务