LeetCode 16. 3Sum Closest LeetCode 18. 4Sum

题目链接:https://leetcode.com/problems/3sum-closest/

题目描述:

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

Subscribe to see which companies asked this question

思路:参考链接:http://blog.csdn.net/doc_sgl/article/details/12462151

    参考2sum问题的解法,降低算法复杂度的关键是先排好序,然后设置首尾设置两个指针,当sum>target时,尾部指针--,反之首部指针++,进行线性搜索。 本题不是sum==target,那么只需不断更新最小值。

一开始写的暴力搜索的三个,都超时了,不过功能上应该没有什么问题,测试简单的情况通过了,应该只是时间复杂度比较高。。。

方法一:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        vector<int> sum;
        int result;
        int len1=nums.size();
        for(int i=0;i<len1;i++)
        {
            for(int j=i+1;j<len1;j++)
            {
                for(int k=j+1;k<len1;k++)
                {
                    sum.push_back(nums[i]+nums[j]+nums[k]);
                }
            }
        }
        int len2=sum.size();
        int index=0;
        int minSum=abs(sum[0]-target);
        for(int m=0;m<len2-1;m++)
        {
            if(abs(sum[m+1]-target)<minSum)
            {
                minSum=abs(sum[m+1]-target);
                index=m+1;
            }
        }
        result=sum[index];
        return result;
    }
};
方法二:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        vector<int> sum;
        int result;
        int len1=nums.size();
        sum.push_back(nums[0]+nums[1]+nums[2]);
        int minSum=abs(sum[0]-target);
        int index=0;
        int flag=0;
        int m=0;
        for(int i=0;i<len1;i++)
        {
            for(int j=i+1;j<len1;j++)
            {
                for(int k=j+1;k<len1;k++)
                {
                    flag=0;
                    if(i+j+k==1)
                    {
                        flag=1;   
                        break;
                    }
                    sum.push_back(nums[i]+nums[j]+nums[k]);
                    m++;
                    if(abs(sum[m]-target)<minSum)
                    {
                        minSum=abs(sum[m]-target);
                        index=m;
                    }
                }
                if(flag==1)
                    break;
            }
            if(flag==1)
                break;
        }
        result=sum[index];
        return result;
    }
};

方法三:

class Solution {
public:
	int threeSumClosest(vector<int>& nums, int target) {
		vector<int> sum;
		int result;
		int len1 = nums.size();
		int m = 0;
		int tmp;
		map<int, int> dif2sumindex;
		map <int, int>::iterator beg;
		int index;
		for (int i = 0; i<len1; i++)
		{
			for (int j = i + 1; j<len1; j++)
			{
				for (int k = j + 1; k<len1; k++)
				{
					tmp = nums[i] + nums[j] + nums[k];
					sum.push_back(tmp);
					dif2sumindex[abs(tmp - target)] = m;
					m++;
				}
			}
		}
		beg = dif2sumindex.begin();
		index=beg->second;
		result = sum[index];
		return result;
	}
};

方法四:(AC的算法)

class Solution {
public:
	int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int len=nums.size();
        int i=1,j=len-1;
        int minDist=abs(nums[0]+nums[1]+nums[len-1]-target);
        int result=nums[0]+nums[1]+nums[len-1];
        int tmp=0;
        for(int k=0;k<len-2;k++)
        {
            if(k>0&&nums[k]==nums[k-1])
                continue;
            i=k+1;j=len-1;
            while(i<j)
            {
                tmp=nums[k]+nums[i]+nums[j];
                if(abs(tmp-target)<minDist)
                {
                    minDist=abs(tmp-target);
                    result=tmp;
                }
                if(tmp==target)
                    return target;
                else if(tmp-target>0)
                    j--;
                else
                    i++;
            }
        }
        return result;
	}
};
题目链接: https://leetcode.com/problems/4sum/
题目描述:

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]
思路:参考前面3sum问题的思路,先用两重for循环确定前两个数字,在剩下的数里面用双指针用线性搜索,算法时间复杂度:O(n3),还有待于改进(可能会用到哈希表,还不太熟悉,以后来改进)
class Solution {
public:
	vector<vector<int>> fourSum(vector<int>& nums, int target) {
		vector<vector<int>> re;
		sort(nums.begin(),nums.end());
		map<vector<int>,int> mark;
		int n = nums.size();
		for (int i = 0; i<n - 3; i++)
		{
			for (int j = i + 1; j< n - 2; j++)
			{
				int p1 = j + 1, p2 = n - 1;
				int sums = nums[i] + nums[j];
				while (p1<p2)
				{
					if (sums + nums[p1] + nums[p2] == target)
					{
						vector<int> tmp = { nums[i], nums[j], nums[p1], nums[p2] };
					    if(mark[tmp]==0)
					    {
						    re.push_back(tmp);
						    mark[tmp]=1;
					    }
						p1++;
						p2--;
					}
					else if (sums + nums[p1] + nums[p2]<target)
						p1++;
					else
						p2--;
				}
			}
		}
		return re;
	}
};




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值