题解 | #和为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下标相撞后,输出空数组。

全部评论

相关推荐

认真搞学习:这么良心的老板真少见
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务