leetcode 最接近的三數之和 / 3Sum closest

題目描述:


    這道題和前面一道題 三數之和:https://blog.csdn.net/twt727/article/details/80003382  類似,思路也差不多,都是頭和尾設置兩個指針從兩頭往中間掃,不同之處在於需要設置一個變量 minRes 來保存最接近的三數之和,邊掃描邊對 minRes 進行更新,代碼如下:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int temp;
        int i,start,end,minRes;
        sort(nums.begin(),nums.end());
        minRes = nums[0] + nums[1] + nums[nums.size() - 1];//對minRes初始化
        for(i = 0 ;i < nums.size() - 2;i++){
            temp = target - nums[i];
            start = i + 1;
            end = nums.size() - 1;
            while(start < end){
                if(nums[start] + nums[end] < temp){ 
                    if(minRes  > target && minRes - target > target - nums[start] - nums[end] - nums[i]){//對前一個minRes比target大還是小要分開討論
                        minRes = nums[start] + nums[end] + nums[i];
                    }
                    if(minRes < target && minRes < nums[start] + nums[end] + nums[i]){
                        minRes = nums[start] + nums[end] + nums[i];
                    }
                    start ++;
                    continue;
                }
                if(nums[start] + nums[end] > temp){
                    if(minRes > target && minRes > nums[start] + nums[end] + nums[i]){
                        minRes = nums[start] + nums[end] + nums[i];
                    }
                    if(minRes < target && target - minRes > nums[start] + nums[end] + nums[i] - target){
                        minRes = nums[start] + nums[end] + nums[i];
                    }
                    end --;
                    continue;
                }
                else{
                    return target;//相等的話直接返回答案
                }
            }
        }
        return minRes;
    }
};

  看了別人的代碼,其實這道題用abs來判斷的話還可以精簡許多,自己還是寫得太渣了,代碼如下:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int min_dis=INT_MAX;
        int result=0;
        if(nums.size()<3)return result;
        sort(nums.begin(),nums.end());
        for(int k=0;k<nums.size();k++){
            int i=k+1,j=nums.size()-1;
            while(i<j){
                int sum=nums[i]+nums[j]+nums[k];
                int temp_dis=abs(target-sum);
                if(temp_dis==0)return sum;
                else if(sum<target){
                    if(min_dis>temp_dis)min_dis=temp_dis,result=sum;
                    i++;
                }
                else{
                    if(min_dis>temp_dis)min_dis=temp_dis,result=sum;
                    j--;
                }
            }
        }
        cout<<min_dis<<endl;
        return result;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章