leetcode 16. 3Sum Closest

来源:互联网 发布:买书哪个网站好 知乎 编辑:程序博客网 时间:2024/05/01 06:13

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.

一个S数组有n个整型数,找到三个数,这三个数的和最接近给定的目标数。返回这三个数的和。

 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).
方法一:

用三重循环找,但是超时了

int threeSumClosest(int* nums, int numsSize, int target) {     int i,j,k;    int sum=INT_MAX;        for(i=0;i<numsSize-2;i++)    {        for(j=i+1;j<numsSize-1;j++)        {            for(k=j+1;k<numsSize;k++)            {                if(abs(nums[i]+nums[j]+nums[k]-target)< abs(sum-target))                {                    sum=nums[i]+nums[j]+nums[k];                }            }        }    }    return sum;}

方法二:

将这个数组的数先排序。

找三个数中的第一个数仍然利用循环(i);其他两个数分别利用两个指针,分别指向

#include<stdio.h>#include<stdlib.h>/** * Return an array of arrays of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */int threeSumClosest(int* nums, int numsSize, int target) {        //排序    int i,j;    int tem;    for(i=0;i<numsSize-1;i++)    {        for(j=0;j<numsSize-i-1;j++)        {            if(nums[j]>nums[j+1])            {                tem=nums[j];                nums[j]=nums[j+1];                nums[j+1]=tem;            }        }    }        int k;    int resum,diff,difmin=INT_MAX;       //resum 最终要返回的和;diff 每次三个数与target的差值的绝对值;difmin 最小差值    //最外面一层循环找到第一个数;循环里面利用两个指针指向第二个数和第三个数    for(i=0;i<numsSize-2;i++)    {        j=i+1;        k=numsSize-1;                while(j<k)        {            diff=abs(nums[i]+nums[j]+nums[k]-target);                    if(diff==0)//差值为0,说明有三个数的和等于target            return target;                    if(diff<difmin)   //本次差值比上次差值小            {                resum=nums[i]+nums[j]+nums[k];                difmin=diff;            }                    if(nums[i]+nums[j]+nums[k]>target)            k--;            else            j++;                 }         }        return resum;    }void main(){int nums[]={-1, 2, 1, -4};int numsSize=4;int returnS = threeSumClosest(nums, numsSize, 2) ;}


0 0