《剑指 Offer》——42、和为 S 的两个数

1. 本题知识点

数学,双指针

2. 题目描述

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

3. 解题思路

  1. 使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。

  2. 如果两个指针指向元素的和 sum < S,移动较小的元素指针,使 sum 变大一些。

  3. 如果两个指针指向元素的和 sum > S,移动较大的元素指针,使 sum 变小一些。

  4. 如果两个指针指向元素的和 sum == S,那么返回这两个元素。

4. 代码

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    
    
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
    
    
        // 一个指针指向元素较小的值
        int low = 0;
        // 一个指针指向元素较大的值
        int high = array.length - 1;
        
        while (low < high) {
    
    
            // 两个指针指向元素的和 s
            int s = array[low] + array[high];
            // 如果 s == sum,那么返回这两个元素。
            if (s == sum) {
    
    
                return new ArrayList<>(Arrays.asList(array[low], array[high]));
            }
            // 如果 s < sum,移动较小的元素指针,使 s 变大一些。
            else if (s < sum) {
    
    
                low++;
            }
            // 如果 s > sum,移动较大的元素指针,使 s 变小一些。
            else {
    
    
                high--;
            }
        }
        return new ArrayList<>();
    }
}

猜你喜欢

转载自blog.csdn.net/bm1998/article/details/108064955