kirasmilel 2017-04-11 12:14 采纳率: 0%
浏览 948

对于leetcode一道算法题的问题

leetcode的第16道题,关于数组的一道算法题,在下的代码不能通过测试集,但是在下实在不知错误出在哪里,特来此处,请帮帮在下。
问题:
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).

在下的代码:

 class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int size = nums.size();  //取数组大小 方便判断
        if (size<3)
            return 0;
        std::sort(nums.begin(), nums.end());  //排序 方便后续操作
        int gap = INT_MAX;  //存储与target相差的值
        for(int i=0;i<size-2;++i){  //因为是三数之和 所以在循环到size-2
            int front = i+1;  //第二个加数
            int back = size-1;  //第三个家数
            while(front<back){  //在for循环内进行第二次循环 以此判断在第一个加数确定的情况下的各种情况
            int sum = nums[i]+nums[front]+nums[back];  //取三数之和
            if(abs(gap)>abs(sum-target))  //判断相差值的大小 如果相差值变大 则gap不变 若相差值变小 则gap更新
                gap=sum-target;
            if (gap == 0)
                return sum;  //相等 返回和
            else if(gap>0)  
                 back--; //较大  让第三个加数变小
            else
                front++;  //较小 让第二个加数变大
            }
            while(i<size-2&&nums[i+1]==nums[i])  //该循环用于跳过不必要的元素
                i++;
        }
        return (gap+target);
    }
};
  • 写回答

1条回答 默认 最新

  • yangbo50304 2017-04-12 03:20
    关注

    你的代码会漏算一些case,按照轮询写的话,你试试

     int threeSumClosest(vector<int>& nums, int target)
    {
        int size = nums.size();  //取数组大小 方便判断
        if (size < 3)
            return 0;
        std::sort(nums.begin(), nums.end());  //排序 方便后续操作
        int gap = INT_MAX;  //存储与target相差的值
        int iSum = 0;
        int iPreSum = iSum;
        bool bSetPreSum = false;
        bool bFind = false;
        int index, index2, index3;
        for (int i = 0; i < size - 2; i++)
        {
            if (bFind)
            {
                break;
            }
            for (int i2 = i + 1; i2 < size - 1; i2++)
            {
                if (bFind)
                {
                    break;
                }
    
                for (int i3 = i2 + 1; i3 < size; i3++)
                {
                    iSum = nums[i] + nums[i2] + nums[i3];
                    if (!bSetPreSum)
                    {
                        iPreSum = iSum;
                        index = i;
                        index2 = i2;
                        index3 = i3;
                        bSetPreSum = true;
                    }
    
                    if (iSum == target)
                    {
                        bFind = true;
                        iPreSum = iSum;
                        index = i;
                        index2 = i2;
                        index3 = i3;
                        break;
                    }
                    else if (abs(iSum - target) < abs(iPreSum - target))
                    {
                        iPreSum = iSum;
                        index = i;
                        index2 = i2;
                        index3 = i3;
                    }
                }
            }
        }
    
        bFind = true;
        printf("closest sum = %d + %d + %d = %d\n", nums[index], nums[index2], nums[index3], (iPreSum));
        return iSum;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图2.0 版本点聚合中Marker的位置无法实时更新,如何解决呢?
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题