Problem Description
Given an array S of n integers, are there any k elements in S such that a[1]+a[2]+..+a[k] = target? Find all unique quadruplets in the array which gives the sum of target.
Some Details
#1 k=2 and target=0, return the index, the solution is unique #15 k=3 and target=0 #16 k=3, return the sum which is closest to the target #18 k=4 #167 == #1 (O(n) is required)
Solution
#1
2个数的和。
(1)枚举每一对数,加加看 O(n^2)慢吗?
(2)如果有序的话,取a[l],a[r]为首尾数,若a[l]+a[r]<target,l++,若a[l]+a[r]>target,r--,否则,找到了。O(n)
正确性是显然的。那么排序时间O(nlgn)即为时间复杂度
#15
3个数的和。
(1)枚举任意三个数,加加看 O(n^3),太慢了?
(2)a[i]+a[j]=-a[k],如果a[i]是个常数的话,c+a[j]=-a[k],问题变为2个数的和,先有序O(nlgn)后处理O(n)。怎么把a[i]变常数?枚举一下i,这样整体复杂度O(n^2)
#16
最近的,和#15一样的题呀。
#18
多枚举一维,也是一个道理。O(n^3)
#167
喵喵喵?#1(2)
Code
class Solution {
public :
vector <int > twoSum(vector <int > & numbers, int target)
{
vector <int > ans;
int len=numbers.size();
int i=0 ,j=len-1 ;
while (i<j)
{
if (numbers[i]+numbers[j]>target) j--; else
if (numbers[i]+numbers[j]<target) i++; else
{
ans.push_back(i+1 );
ans.push_back(j+1 );
return ans;
}
}
return ans;
}
};
class Solution {
public :
int threeSumClosest(vector <int > & nums, int target) {
int siz=nums.size(),i=0 ,j,k;
int ans=nums[0 ]+nums[1 ]+nums[2 ];
sort(nums.begin(),nums.end());
while (i<siz-1 )
{
j=i+1 ; k=siz-1 ;
while (j<k)
{
int now=nums[i]+nums[j]+nums[k];
if (abs (target-now)<abs (target-ans)) ans=now;
if (now==target) return target;
if (now>target && j<k) k--; else
if (now<target && j<k) j++;
if (j>=k) break ;
}
i++;
}
return ans;
}
};