2824. Count Pairs Whose Sum is Less than Target
- Given a 0-indexed integer array
nums
of lengthn
and an integertarget
, return the number of pairs(i, j)
where0 <= i < j < n
andnums[i] + nums[j] < target
.
Example 1
Input: nums = [-1,1,2,3,1], target = 2
Output: 3
Explanation: There are 3 pairs of indices that satisfy the conditions in the statement:
- (0, 1) since 0 < 1 and nums[0] + nums[1] = 0 < target
- (0, 2) since 0 < 2 and nums[0] + nums[2] = 1 < target
- (0, 4) since 0 < 4 and nums[0] + nums[4] = 0 < target
Note that (0, 3) is not counted since nums[0] + nums[3] is not strictly less than the target.
Example 2
Input: nums = [-6,2,5,-2,-7,-1,3], target = -2
Output: 10
Explanation: There are 10 pairs of indices that satisfy the conditions in the statement:
- (0, 1) since 0 < 1 and nums[0] + nums[1] = -4 < target
- (0, 3) since 0 < 3 and nums[0] + nums[3] = -8 < target
- (0, 4) since 0 < 4 and nums[0] + nums[4] = -13 < target
- (0, 5) since 0 < 5 and nums[0] + nums[5] = -7 < target
- (0, 6) since 0 < 6 and nums[0] + nums[6] = -3 < target
- (1, 4) since 1 < 4 and nums[1] + nums[4] = -5 < target
- (3, 4) since 3 < 4 and nums[3] + nums[4] = -9 < target
- (3, 5) since 3 < 5 and nums[3] + nums[5] = -3 < target
- (4, 5) since 4 < 5 and nums[4] + nums[5] = -8 < target
- (4, 6) since 4 < 6 and nums[4] + nums[6] = -4 < target
Method 1
【O(nlogn) time | O(1) space】
package Leetcode.TwoPointer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author zhengxingxing
* @date 2025/02/22
*/
public class CountPairsWhoseSumIsLessThanTarget {
public static int countPairs(List<Integer> nums, int target) {
// Sort the list to enable two pointer approach
Collections.sort(nums);
int count = 0; // Counter for valid pairs
int left = 0; // Left pointer starting from beginning
int right = nums.size() - 1; // Right pointer starting from end
while (left < right) {
// Calculate current sum of elements at left and right pointers
int currentSum = nums.get(left) + nums.get(right);
if (currentSum < target) {
// If current sum is less than target:
// All pairs between left and right will also be valid
// Because array is sorted, nums[left] + nums[right-1] will be even smaller
// We add (right - left) pairs to our count
count += right - left;
// Move left pointer to find more pairs
left++;
} else {
// If current sum is >= target:
// Need to decrease sum, so move right pointer left
right--;
}
}
return count;
}
public static void main(String[] args) {
// Test Case 1: Normal case with positive and negative numbers
List<Integer> nums1 = new ArrayList<>(Arrays.asList(-1, 1, 2, 3, 1));
int target1 = 2;
System.out.println("Test Case 1 Result: " + countPairs(nums1, target1)); // Expected output: 3
// Test Case 2: Case with more negative numbers
List<Integer> nums2 = new ArrayList<>(Arrays.asList(-6, 2, 5, -2, -7, -1, 3));
int target2 = -2;
System.out.println("Test Case 2 Result: " + countPairs(nums2, target2)); // Expected output: 10
// Test Case 3: Edge case - empty list
List<Integer> nums3 = new ArrayList<>();
int target3 = 1;
System.out.println("Test Case 3 Result: " + countPairs(nums3, target3)); // Expected output: 0
// Test Case 4: Edge case - single element list
List<Integer> nums4 = new ArrayList<>(Arrays.asList(1));
int target4 = 1;
System.out.println("Test Case 4 Result: " + countPairs(nums4, target4)); // Expected output: 0
}
}
Enjoy Reading This Article?
Here are some more articles you might like to read next: