LeetCode-15-3Sum(证明/KSum)-Medium

来源:互联网 发布:淘宝女外套 编辑:程序博客网 时间:2024/04/24 23:25

题目理解:

求解vector中三个数(a,b,c)之和为0,其中,a、b、c不能为重复值,并且按照a<b<c的规则进行排列;


解题分析:

1. 典型的KSum题目;

1)先排序;

2)首尾两端两个指针同时向对端移动;

3)过程中避免重复的结果;

题目的关键是证明两个指针向对端移动的过程中,不会漏掉有效的取值(可以使用反正法进行证明);


解题代码:

class Solution {public:    vector<vector<int>> threeSum(vector<int>& nums) {        vector<vector<int>> ans;        int size=nums.size();        if(size<3){            return ans;        }                sort(nums.begin(),nums.end());                int pre=1;//the first element can not greater than 0        for(int i=0;i<size-2;i++){            if(nums[i]==pre){                continue;            }else{                pre=nums[i];            }                        int left=i+1;            int right=size-1;            int preLeft, preRight;            bool isInitLR=false;            while(left<right){                int sum=nums[i]+nums[left]+nums[right];                if(sum>0){                    right--;                }else if(sum<0){                    left++;                }else{                    if(!isInitLR){                        isInitLR=true;                    }else{                        if(nums[left]==preLeft){                            left++;                            continue;                        }                                                if(nums[right]==preRight){                            right--;                            continue;                        }                    }                                    vector<int> t;                    t.push_back(nums[i]);                    t.push_back(nums[left]);                    t.push_back(nums[right]);                                        ans.push_back(t);                    preLeft=nums[left];                    preRight=nums[right];                    left++;                    right--;                                        //cout<<"ans.push_back()"<<endl;                }                                //cout<<"left= "<<left<<endl;                //cout<<"right= "<<right<<endl;            }        }                return ans;    }};


0 0
原创粉丝点击