[leetcode] 16 3Sum Closest(数组)

暴力循环的时间复杂度是O(N^3),肯定是不可取的。我们要充分利用题目中的条件进行分析,如何才能相对高效的比较数组中指定个数元素的和  和target的大小呢?

我们可以先对数组进行排序,如果是计算两个元素的和的话,我们会分别设置头和尾两个指针,向中间靠拢,那么三个的话,我们只需要先对第一个数进行循环取值下标i,剩下的两个指针分别指向i+1和数组的最后一个元素,这样的复杂度是 排序O(nlogn) + 查找O(n^2) = O(n^2)。

注:不要sum>target就 return,也许在下一个循环中还会有合适的。

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int ans,k,sum,j;
		sort(nums.begin(),nums.end());
		int flag=0;
	    for(int i=0;i<nums.size();i++)
	    {
    		j=i+1;
    		k=nums.size()-1;
    		goout=0;
    		while(j<k)
    		{
		    	sum=nums[i]+nums[j]+nums[k];
 	
		    	if(flag==0)
		    	{
	    			ans=sum;
	    			flag=1;
	    		}
	    		
	    		if(abs(sum-target)<abs(ans-target))
	    		ans=sum;
	    		
	    	    if(ans==target)
	    		return ans;
	    		
	    		if(sum<target)
	    		j++;
	    		else 
	    		k--;
		    }
		    
		    
    	}
        loop:
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值