I题目描述:

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

解析:

二分法

Java:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        for(int i = 0; i < nums.length; i++) {
            if(nums[left] + nums[right] < target) {
                left++;
            } else if(nums[left] + nums[right] > target) {
                right--;
            } else {
                return new int[] {nums[left], nums[right]};
            }
        }
        return new int[0];
    }
}

JavaScript:

var twoSum = function(nums, target) {
    let set = new Set();
    for(let i = 0; i < nums.length; i++) {
        if(!set.has(target - nums[i])) {
            set.add(nums[i]);
        } else {
            return [nums[i], target - nums[i]];
        }
    }
    return [];
};

II题目描述:

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

解析:

数学方法

Java:

class Solution {
    public int[][] findContinuousSequence(int target) {
        int left = 1, right = 1, sum = 0, end = target / 2;
        List<int[]> res = new ArrayList<>();
        while(left <= end) {
            if(sum < target) {
                sum += right;
                right++;
            } else if(sum > target) {
                sum -= left;
                left++;
            } else {
                int[] arr = new int[right - left];
                for(int i = left; i < right; i++) {
                    arr[i - left] = i;
                }
                res.add(arr);
                sum -= left;
                left++;
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}

JavaScript:

var findContinuousSequence = function(target) {
    let left = 1, right = 1, sum = 0, end = target / 2;
    let res = [];
    while(left <= end) {
        if(sum < target) {
            sum += right;
            right++;
        } else if(sum > target) {
            sum -= left;
            left++;
        } else {
            let arr = [];
            for(let i = left; i < right; i++) {
                arr[i - left] = i;
            }
            res.push(arr);
            sum -= left;
            left++;
        }
    }
    return res;
};