题解 | #和为S的两个数字#

和为S的两个数字

https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b

import java.util.*;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> result = new ArrayList<>();
        if (array == null || array.length == 0 || sum == 0) {
            return result;
        }
        int left = 0;
        int right = array.length - 1;
        while (left != right && left < array.length && right > 0) {
            if (array[right] >= sum) {
                right--; //先找到最接近sum的数值
            }
            //再进去左右微调操作,直到相等||左右浮标相撞为止。
            else if (array[left] + array[right] == sum) {
                result.add(array[left]);
                result.add(array[right]);
                break;
            } else if (array[left] + array[right] > sum) { //如果加起来仍然偏大,代表右边的数依然偏大,右浮标向左调
                right--;
            } else { //如果加起来仍然偏小,代表左边的数不够大,则左边向右调
                left++;
            }
        }
        return result;
    }
}

通过对数列找到最接近但小于sum的数,定义为right。再定义数列最小的数为left。在迭代时如果left和right对应下标的值的和比sum大,代表right还是偏大,向左调整寻找更小的数;如果迭代到left和right下标对应值的和比sum小,left向右找更大的数进行匹配;反复迭代到找到left和right对应的值的和为sum的值,然后输出。后者left和right下标相撞后,输出空数组。

全部评论

相关推荐

可可可可可_:nb啊,看样子是专科玩了几年随便专升本了个民办,又玩了两年。你这能找到我吃
点赞 评论 收藏
分享
Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务