Two Sum II
Question
Given an array of integers, find how many pairs in the array such that their sum is bigger than a specific target number. Please return the number of pairs.
Example
Given numbers = [2, 7, 11, 15]
, target = 24. Return 1. (11 + 15 is the only pair)
Challenge
Do it in O(1) extra space and O(nlogn) time.
Tags
Two Pointers Sort
Analysis
与two sum问题相比,因为是“大于”的关系比较,因此用Hashmap不能达到记忆化查找的效果。这里用two pointers的思路求解则十分简明: 1. 先对数组排序,时间复杂度为O(nlogn) 2. 初始化left = 0, right = nums.length - 1,如果有一个满足nums[left] + nums[right] > target, 那么对于left ~ right - 1,都会满足条件,因此计入结果中,count = count + right - left。循环结束的条件是 left < right 不被满足,说明两个指针相遇,所有的情况都被遍历。这一个过程的时间复杂度是 O(n)。
Solution
public class Solution {
/**
* @param nums: an array of integer
* @param target: an integer
* @return: an integer
*/
public int twoSum2(int[] nums, int target) {
// Invalid input or exception
if (nums == null || nums.length == 0) {
return 0;
}
// Sort the Array nums[] to ascending order
Arrays.sort(nums);
// Use two pointers
int count = 0;
int pl = 0;
int pr = nums.length - 1;
while (pl < pr) {
if (nums[pl] + nums[pr] > target) {
// Index from pl to pr - 1 will all be counted
count = count + (pr - pl);
pr--;
} else {
pl++;
}
}
return count;
}
}
Last updated
Was this helpful?