剑指offer系列之四十一:和为S的两个数字且乘积最小

简介:

题目描述

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

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

有了上一题的基础,解决这题应该不难,思路与上一题差不多,不过这里只需要要求两个数字即可。所以可以设定两个指针,第一个指针指向数组的第一个元素,第二个指针指向最后一个元素,不断改变第一个指针的位置就可以确定和为S的两个数字。这里还有一个要求是这两个数字的乘积最小,实际上由于数组是递增排序的,所以第一个找到的两个数字就是乘积最小的两个数字,相反如果要求是乘积最大的呢?当然是中间位置找到的那两个数字了。这是数学上的知识了,不再赘述。所以虽然有了乘积最小的要求,实际上是形同虚设的,这里实现的代码如下(已被牛客AC):

package com.rhwayfun.offer;

import java.util.ArrayList;

public class FindTwoNumberSum {

    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(array == null || array.length < 1) return list;
        int low = 0;
        int high = array.length - 1;
        while(low < high){
            int curSum = array[low] + array[high];
            if(curSum == sum){
                //由于数组是递增排序的,所以第一个找到的数对肯定是乘积最小的。
                //比如,1+4=2+3,如果从第一个位置开始找的话,显然1与4的乘积是最小的
                list.add(array[low]);
                list.add(array[high]);
                break;
            }else if(curSum > sum){
                high--;
            }else{
                low++;
            }
        }
        return list;
    }

    public static void main(String[] args) {
        int[] array = new int[]{1,2,7,8,13,15};
        ArrayList<Integer> list = new FindTwoNumberSum().FindNumbersWithSum(array, 15);
        System.out.println(list);
    }
}
AI 代码解读
目录
打赏
0
0
0
0
85
分享
相关文章
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II
70 0
|
7月前
|
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
61 0
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
每日一题——除自身以外数组的乘积
每日一题——除自身以外数组的乘积
|
10月前
每日一题——旋转数组的最小数字(II)
每日一题——旋转数组的最小数字(II)
|
10月前
|
每日一题《剑指offer》数组篇之旋转数组的最小数字
每日一题《剑指offer》数组篇之旋转数组的最小数字
52 0
每日一题《剑指offer》数组篇之旋转数组的最小数字
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
118 0
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
代码随想录训练营Day2:1.有序数组的平方 2.长度最小的子数组3,螺旋矩阵
33 0