剑指 Offer - 42 - 和为 S 的两个数字(排序数组)

发布于 2024-09-19 14:40:58 字数 1364 浏览 10 评论 0

题目

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

解析

比较简单的双指针题目。肯定不是两重循环找。

思路

  • 设两个指针 L、R ,分别是排序数组的开头和结尾;
  • 然后下面就是两个指针 L、R 向中间靠拢的过程。① 如果 arr[L] + arr[R] > sum ,说明右边那个 arr[R] 大了,需要向左移动,看能不能找到更小的 arr[R] 来和 arr[L] 一起组成 sum 。② 同理,如果 arr[L] + arr[R] < sum ,说明左边那个 arr[L] 小了,需要向右移动,看能不能找到更大的 arr[L] 来和 arr[R] 一起组成 sum 。③ 否则等于就返回即可;
  • 题目说要找到乘积最小的,可以发现, L、R 隔的越远, arr[L] * arr[R] 乘积越小,所以我们的做法没问题。
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
        ArrayList<Integer> res = new ArrayList<>();
        int L = 0, R = array.length - 1;
        while(L < R){
            if(array[L] + array[R] == sum){
                res.add(array[L]);
                res.add(array[R]);
                return res;
            }
            if(array[L] + array[R] < sum) L++;
            else R--;
        }
        return res;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

寒江雪…

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文