How to Find the Closest Sum of Three in an Array using Two Point
- 时间:2020-09-25 11:32:47
- 分类:网络文摘
- 阅读:100 次
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
The straightforward solution has to be the bruteforce algorithm, that exhausts every three numbers using O(N^3) loop – which is obviously too slow.
Two Pointer Algorithm in O(nlogN)
We first need to sort the entire array which takes O(nlogN). Once we have determined the first two numbers in O(N^2), we can search the rest in (logN) as the array is sorted. The following algorithm takes O(n*n*logN).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(begin(nums), end(nums)); int sum = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.size() - 2; ++ i) { for (int j = i + 1; j < nums.size() - 1; ++ j) { int k = nums.size() - 1; while (j < k) { int cur = nums[i] + nums[j] + nums[k]; if (cur == target) { return target; } else if (cur < target) { j ++; } else { k --; } if (abs(cur - target) < abs(sum - target)) { sum = cur; } } } } return sum; } }; |
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(begin(nums), end(nums)); int sum = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.size() - 2; ++ i) { for (int j = i + 1; j < nums.size() - 1; ++ j) { int k = nums.size() - 1; while (j < k) { int cur = nums[i] + nums[j] + nums[k]; if (cur == target) { return target; } else if (cur < target) { j ++; } else { k --; } if (abs(cur - target) < abs(sum - target)) { sum = cur; } } } } return sum; } };
However, we don’t need to bruteforce the second number. Once the first number is settled, we can using two pointer algorithm to determine the remainding two numbers. If at anytime, we find a sum that is equal to the target, we immediately return the sum otherwise, we need to iteratively store the minimal sum difference.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(begin(nums), end(nums)); int sum = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.size() - 2; ++ i) { int j = i + 1; int k = nums.size() - 1; while (j < k) { int cur = nums[i] + nums[j] + nums[k]; if (cur == target) { return target; } else if (cur < target) { j ++; } else { k --; } if (abs(cur - target) < abs(sum - target)) { sum = cur; } } } return sum; } }; |
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(begin(nums), end(nums)); int sum = nums[0] + nums[1] + nums[2]; for (int i = 0; i < nums.size() - 2; ++ i) { int j = i + 1; int k = nums.size() - 1; while (j < k) { int cur = nums[i] + nums[j] + nums[k]; if (cur == target) { return target; } else if (cur < target) { j ++; } else { k --; } if (abs(cur - target) < abs(sum - target)) { sum = cur; } } } return sum; } };
The optimal algorithm using two pointer algorithm is O(nlogN).
–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:多个品牌婴幼儿配方乳粉被曝配方都一样 新食品安全法“史上最严”建立惩罚制度 适合在夏天吃的既简单又美味的凉拌菜 薏米与红豆的多种搭配煮法可健脾养血 好时巧克力1年3上黑榜 违规使用维生素E 近些年被曝光的大米安全事件一览 夏日进补:男不离韭,女不离藕之解读 “僵尸肉”蹿上餐桌拷问食品安全监管 夏季炒菜时可多放一种调料——花椒 四种热门食物并没有那么神奇的营养功效
- 评论列表
-
- 添加评论