zoukankan      html  css  js  c++  java
  • OJ练习48——T15 3Sum

    找一列整数中和为0的三个数,要求返回结果按序排列,且返回的序列之间互不相同。例如:

    array S = {-1 0 1 2 -1 -4},
    A solution set is:
    (-1, 0, 1)    (-1, -1, 2)

    【思路】

    (看来的,自己真是没有一点算法头脑)

    对于每一个当前数,用2sum算法求剩下的两个数和为当前数相反数。3sum退化成2sum问题。

    由于题目不要求返回原序列的序号,所以可以用2sum的先排序再双指针向中遍历的算法。

    【other code】

    vector<vector<int>> threeSum(vector<int>& num) {
            vector<vector<int> > ret;
            ret.clear();
            sort(num.begin(),num.end());//soga!!
            for(int i=0; i!=num.size();i++){
                if(i > 0 && num[i]==num[i-1])
                    continue;//duplicate triplets
                int j,k;
                j=i+1;
                k=num.size()-1;
                while(j<k){
                    if(j>i+1&&num[j]==num[j-1]){ 
                        j++;
                        continue;
                    }
                    if(k<num.size()-1&& num[k]==num[k+1]){
                        k--;
                        continue;
                    }
                     int sum = num[i] + num[j] + num[k];
                    if(sum>0){
                        k--;
                    }else if(sum<0){
                        j++;
                    }else{
                        vector<int> tmp;
                        tmp.push_back(num[i]);
                        tmp.push_back(num[j]);
                        tmp.push_back(num[k]);
                        ret.push_back(tmp);
                        j++;
                    }
                }
            }
            return ret;
        } 

    【总结】

    因为序列中有重复的数字所以要去除重复,j和k是双指针向中搜索。

    可能会奇怪,如果忽略了重复的数,(-1,-1,2)的情况怎么办。

    于是我分步调试了一下= =

    i指向-1时,j=i+1,指向-1,这样就不会漏掉三个数中两个数相同的情况了。O(∩_∩)O~~

    另外,stl的sort函数应该是快排吧,时间是O(nlogn)。有库函数很方便,还以为要自己手动写了……懒癌。

    【后记】

    虽然耗费了一上午的时间,但总结了T1的2sum,看了编程之美2.12节相关解释,还是有点收获的。

  • 相关阅读:
    linux使用命令记录
    (转)如何连接远程桌面
    PLSQL将查询结果复制为insert语句
    用foxPro打开dbf文件
    (转)PLSQL新手使用教程
    CPN TOOL使用
    运行mongoDB
    PLSQL连接数据库
    剑指 Offer 10- II. 青蛙跳台阶问题(简单)
    剑指 Offer 10- I. 斐波那契数列(简单)
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4496872.html
Copyright © 2011-2022 走看看