栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Leetcode16.最接近的三数之和(c++,beats 81.94%)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode16.最接近的三数之和(c++,beats 81.94%)

 本题依旧采用了双指针方法,整体思路和15题解题思路差不多

整体思路:

(1)先检查是否nums元素个数为3,若果为3,直接返回此3个元素之和。如果个数超过3,将nums从小到大排序,方便之后定指针移动顺序。

(2)定义int型的min变量并为其赋初值,含义为最接近目标的元素之和。

(3)从now=0至now

(4)开始left、right指针的移动,循环条件为while(left

(5)每次指针移动时,都记录当下选定的三个数值之和即now_sum,将其与min比较,只有当min>now_sum时,才将now_sum数值赋予min,再集训循环比较。

(6)移动指针时为了优化,若移动前后指针数值相同,则继续移动,直至数值不同。若已经到了(left+1==right)情况下,将min与now_sum进行比较赋值后直接退出。

class Solution {
public:
    int threeSumClosest(vector& nums, int target) {
        sort(nums.begin(),nums.end());//先将其进行从小到大的排序
        if(nums.size()==3) return nums[0]+nums[1]+nums[2];
        int min=nums[0]+nums[1]+nums[nums.size()-1];
        for(int now=0;nowabs(now_sum-target))?now_sum:min;
                        break;
                    }
                    //还未到本轮的最后一次,如果现在的和数值过大则移动右指针,过小移动左指针
                    if(now_sum-target>0){
                        min=(abs(min-target)>abs(now_sum-target))?now_sum:min;
                        right--;
                        //如果移动后数值一样,则继续移动
                        while(nums[right+1]==nums[right]) {
                            right--;
                            if(right<0) break;
                        }
                    }
                    else if(now_sum-target<0){
                        min=(abs(min-target)>abs(now_sum-target))?now_sum:min;
                        left++;
                        //如果移动后数值一样,则继续移动
                        while(nums[left-1]==nums[left]){
                            left++;
                            if(left>=nums.size()) break;
                        }
                    }
                }
            }
        }
        return min;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号