Leetcode: 4Sum

来源:互联网 发布:网易云 播放失败 mac 编辑:程序博客网 时间:2024/05/17 05:37

思路:这次解法的时间复杂度是O(n^3),过程如下:

1、先对数组排序;

2、一次选出数组的两个元素;

3、再前面两个元素的后面分别标记两个前后索引,得到新的两个元素,与前面的两个元素相加,有3种情况考虑,1)如果和等于目标值,得到一个解,前索引后移,后索引前移去发掘新的解,2)如果和大于目标值,后索引前移以便减少和,3)和小于目标值,前索引后移增大和;

4、回到第2步,直到挑选完所有的数组元素。

注意:因为题目不能出现重复解,所以在记录解的数据结构中,最好采用set这一个值不会重复出现的结构,否则,需要在搜索过程中加以剔除重复元素。

code:

class Solution {public:    vector<vector<int> > fourSum(vector<int> &num, int target) {        vector<vector<int> > ret;        int len = num.size();        if(len <4)return ret;        sort(num.begin(),num.end());        vector<int> temp(4);        set<vector<int>> setRet;        for(int i=0;i <len-3;i++){            temp[0] = num[i];            for(int j=i+1;j<len - 2;j++){                temp[1] = num[j];                int tempTarget = target - temp[0] - temp[1];                int l = j+1, r = len-1;                while(l<r){                    if(num[l] + num[r] == tempTarget){                        temp[2] = num[l];                        temp[3] = num[r];                        setRet.insert(temp);                        r--;                        l++;                    }                    else if(num[l] + num[r] > tempTarget)                        r--;                    else                        l++;                                        }            }        }        set<vector<int>>::iterator it = setRet.begin();        for(;it!=setRet.end();it++)            ret.push_back(*it);        return ret;    }};


0 0
原创粉丝点击