1. 程式人生 > 其它 >雙指標解決兩數之和、三數之和、四數之和這類求和問題

雙指標解決兩數之和、三數之和、四數之和這類求和問題

這種求和找下標陣列的演算法題本質上都是可以轉化為把陣列排序以後的雙指標問題。

不管求幾個數字之和都是轉化為最後兩個數的和用一個值來比較然後移動指標確定位置。

leetcode167.兩數之和 II - 輸入有序陣列

var twoSum = function(numbers, target) {
    let len = numbers.length;
    let left = 0, right = len - 1;
    while(left < right){
        let sum = numbers[left] + numbers[right];
        
if(sum == target){ return [left+1,right+1]; } else if (sum < target){ left++; }else { right--; } } return [-1,-1]; };

leetcode15.三數之和

var threeSum = function(nums) {
    const len = nums.length;
    let res = [];
    nums.sort((a,b) 
=> a - b); for(let i = 0; i < len; i++){ if(nums[i] > 0) break; if(i > 0 && nums[i] === nums[i-1]) continue; let target = -nums[i]; let left = i + 1, right = len - 1; while(left < right){ let sum = nums[left] + nums[right];
if(sum === target){ res.push([nums[i],nums[left],nums[right]]); left++; right--; while(left < right && nums[left] === nums[left-1]) left++; while(left < right && nums[right] === nums[right+1]) right--; } else if (sum < target){ left++; } else { right--; } } } return res; };

leetcode18.四數之和

var fourSum = function(nums, target) {
    const len = nums.length;
    let res = [];
    if(len < 4) return res;
    nums.sort((a,b) => a - b);
    for(let i = 0; i < len - 3; i++){
        if(i > 0 && nums[i] === nums[i-1]) continue;
        if(nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target) break;
        let target3 = target - nums[i];
        for(let j = i + 1; j < len - 2; j++){
            if(j > i + 1 && nums[j] === nums[j-1]) continue;
            let target2 = target3 - nums[j];
            let left = j + 1, right = len - 1;
            while(left < right){
                let sum = nums[left] + nums[right];
                if(sum === target2){
                    res.push([nums[i],nums[j],nums[left],nums[right]]);
                    left++;
                    right--;
                    while(left < right && nums[left] === nums[left-1]) left++;
                    while(left < right && nums[right] === nums[right+1]) right--;
                } else if (sum < target2){
                    left++;
                } else {
                    right--;
                }
            }
        }
    }
    return res;
};