923. 3Sum With Multiplicity

Description

Given an integer array arr, and an integer target, return the number of tuples i, j, k such that i < j < k and arr[i] + arr[j] + arr[k] == target.

As the answer can be very large, return it modulo 109 + 7.

Constraints

  • 3 <= arr.length <= 3000

  • 0 <= arr[i] <= 100

  • 0 <= target <= 300

Approach

Examples

Input: arr = [1,1,2,2,3,3,4,4,5,5], target = 8

Output: 20

Explanation:

Enumerating by the values (arr[i], arr[j], arr[k]):

(1, 2, 5) occurs 8 times;

(1, 3, 4) occurs 8 times;

(2, 2, 4) occurs 2 times;

(2, 3, 3) occurs 2 times.

Solutions

/**
 * Time complexity : 
 * Space complexity : 
 */

// Time Limit Exceeded

class Solution {
    public int threeSumMulti(int[] arr, int target) {
        int n = arr.length;
        long result = 0;
        Arrays.sort(arr);
        
        for(int i = 0; i < n-2; i++) {
            int t = target - arr[i];
            int left = i + 1, right = n-1;
            while(left < right) {
                int sum = arr[left] + arr[right];
                if(sum < t) {
                    left++;
                } else if(sum  > t) {
                    right--;
                } else {
                    int tempRight = right;
                    while(left < right && arr[left] + arr[right] == t) {
                        result++;
                        right--;
                    }
                    right = tempRight;
                    left++;
                }
            }
        }
        return (int) (result%1000000007);
    }
}

Follow up

Last updated

Was this helpful?