剑指offer—57.和为S的两个数字—分析及代码(Java)

剑指offer——57.和为S的两个数字——分析及代码[Java]

一、题目

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

二、分析及代码

1. 双指针

(1)思路

在数组两端设计两个指针,若对应数字之和小于 S,将头部指针后移,反之将尾部指针前移,直至找到和为 S 的两个数或指针相遇。
和为 S 的两个数,距离越远,乘积越小,因此上述方法找到的第一对数字即为所求解。

(2)代码

import java.util.ArrayList;
public class Solution {
    
    
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
    
    
        ArrayList<Integer> ans = new ArrayList<>();
        if (array == null || array.length < 2)
            return ans;
        
        int l = 0, r = array.length - 1;
        while (l < r && (array[l] + array[r] != sum)) {
    
    
            if (array[l] + array[r] < sum)
                l++;
            else
                r--;
        }
        
        if (l != r) {
    
    
            ans.add(array[l]);
            ans.add(array[r]);
        }
        return ans;
    }
}

(3)结果

运行时间:16ms,占用内存:9308k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/111875247