leetcode16. 3Sum Closest

思路:
利用2sum方法来做,最接近就是相差绝对值当前最小


class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        vector<int>::iterator iter = nums.begin();
        vector<int>::iterator iter_end = nums.end();
        long long int threeSumValue = 0;
        long long int temp = 0;
        long long int threeSumGap = INT_MIN;
        threeSumGap *=  - 1;
        while (iter != iter_end) {
            temp = *iter + twoSum(nums, target - *iter, iter - nums.begin());
            if (abs(temp - target) < threeSumGap) {
                threeSumGap = abs(temp - target);
                threeSumValue = temp;
            }

            iter++;
        }

        return threeSumValue;
    }


    int twoSum(vector<int> numsCopy, int target, int pos) {
        numsCopy.erase(numsCopy.begin() + pos);
        sort(numsCopy.begin(), numsCopy.end());

        //copy(numsCopy.begin(), numsCopy.end(), ostream_iterator<int>(cout, "\n"));
        vector<int>::iterator iter = numsCopy.begin();
        vector<int>::iterator iter_end = numsCopy.end();
        vector<int>::iterator left = iter;
        long long  int gap = INT_MIN;
        gap *= -1;
        long long  int temp = 0;
        iter_end--;
        vector<int>::iterator right = iter_end;
        while (iter != iter_end) {

            temp = *iter + *iter_end - target;
            if (temp<0) {
                if (abs(temp)<gap) {
                    left = iter;
                    right = iter_end;
                    gap = abs(temp);
                }
                ++iter;
            }
            else if (temp>0) {
                if (abs(temp)<gap) {
                    left = iter;
                    right = iter_end;
                    gap = abs(temp);
                }
                iter_end--;
            }
            else {

                left = iter;
                right = iter_end;
                gap = 0;

                break;
            }
        }

        return *left + *right;
    }


};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值