leetcode #1 #15 #16 #18 #167 K-Sum Problem Solution

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

//随便贴两个吧
//#167
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;
    }
};

//#16
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;
            //j++; k--;
        }
        i++;
       }
       return ans;        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值