Two Sum - Unique pairs Lintcode
Given an array of integers, find how many unique pairs
in the array such that their sum is equal to a specific target number. Please return the number of pairs.
Example
Given nums = [1,1,2,45,46,46]
, target = 47
return 2
1 + 46 = 47
2 + 45 = 47
这道题还蛮简单的,就是从两头往中间算就可以了。需要注意的是,把while放在相等的情况里面,可以加快速度。
原始版本:
public class Solution { /** * @param nums an array of integer * @param target an integer * @return an integer */ public int twoSum6(int[] nums, int target) { if (nums == null || nums.length == 0) { return 0; } Arrays.sort(nums); int start = 0; int end = nums.length - 1; int count = 0; while (start < end) { if (start > 0 && nums[start] == nums[start - 1]) { start++; continue; } if (end < nums.length - 1 && nums[end] == nums[end + 1]) { end--; continue; } if (nums[start] + nums[end] < target) { start++; } else if (nums[start] + nums[end] > target) { end--; } else { count++; start++; } } return count; } }
改进版本:
public class Solution { /** * @param nums an array of integer * @param target an integer * @return an integer */ public int twoSum6(int[] nums, int target) { if (nums == null || nums.length == 0) { return 0; } Arrays.sort(nums); int start = 0; int end = nums.length - 1; int count = 0; while (start < end) { if (nums[start] + nums[end] < target) { start++; } else if (nums[start] + nums[end] > target) { end--; } else { count++; start++; end--; while (start < end && nums[start] == nums[start - 1]) { start++; } while (start < end && nums[end] == nums[end + 1]) { end--; } } } return count; } }