Finding all unique triplets that sums to zero[部分转载]

题目:

http://www.leetcode.com/2010/04/finding-all-unique-triplets-that-sums.html

 

分析:

首先brute force,O(n3)。i j k从0到n-1各循环一遍,肯定不能要。

其次,我们先假设只有2个数,对于一个排序的数组来说,如果想要a + b = 0,那么可以两个指针,一个在head(),一个在tail(),然后判断这两个it的值相加是否等于0,如果小于,那么前面的指针++,如果大于,那么后面的指针--,直到指针相遇或者找到和为0的一对。这使得2个数字的算法复杂度由O(n2) -> O(n)。

然后,对于3个数字的相加,先变为 a + b = -c; 那么,对于其中一个数,做一个O(n)的遍历,剩下两个数进行一个算法复杂度的降低(O(n2) -> O(n))。得到如下代码:

    set<vector<int> > threeSum(vector<int> &num) {
        sort(num.begin(), num.end());
        set< vector<int> > triplets;
        vector<int> triplet(3);
        int n = num.size();

        for (int i = 0; i < n; i++)
        {
            int j = i + 1;
            int k = n - 1;
            while (j < k)
            {
                if (num[j] + num[k] < 0 - num[i])
                    j++;
                else if (num[j] + num[k] > 0 - num[i])
                    k--;
                else
                {
                    vector<int>::iterator it = triplet.begin();
                    *it++ = num[i];
                    *it++ = num[j];
                    *it++ = num[k];
                    j++;
                    k--;
                    triplets.insert(triplet);
                }
            }
        }
        return triplets;
    }

最终的复杂度为O(n2)。

 

另外转载一篇从网上看来的,返回值是vector< vector<int> >的解法,非常好!在LeetCode Online Judge上不会超时:

http://www.cnblogs.com/codingmylife/archive/2012/08/30/2663796.html

它的思想是手动过滤重复。

// Dedup directly, 
// LeetCode Judge Large, 272 milli secs.
vector<vector<int> > three_sum(vector<int> &num) 
{
    vector<vector<int> > ret;
    
    if (num.size() == 0) return ret;
    
    sort(num.begin(), num.end());
    
    for (vector<int>::const_iterator it = num.begin();
        it != num.end();
        ++it)
    {
        // Dedup
        if (it != num.begin() && *it == *(it - 1))
        {
            continue;
        }
        
        // Dedup, front = it + 1
        vector<int>::const_iterator front = it + 1;
        vector<int>::const_iterator back = num.end() - 1;
        
        while (front < back)
        {
            const int sum = *it + *front + *back;
            
            if (sum > 0)
            {
                --back;
            }
            else if (sum < 0)
            {
                ++front;
            }
            // Dedup
            else if (front != it + 1 && *front == *(front - 1))
            {
                ++front;
            }
            // Dedup
            else if (back != num.end() - 1 && *back == *(back + 1))
            {
                --back;
            }
            else
            {
                vector<int> result;
                
                // Already sorted.
                result.push_back(*it);
                result.push_back(*front);
                result.push_back(*back);
                
                ret.push_back(result);
                
                ++front;
                --back;
            }
        }
    }
    
    return ret;
}

 

 

 

 

EOF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这条报错信息表明在Qt程序中使用OpenGL时,无法找到与当前的qsurfaceformat相匹配的fbconfig。 fbconfig是OpenGL中用来配置帧缓冲区像素格式的一种结构。qsurfaceformat是Qt中用来描述帧缓冲区配置的类。 在Qt中,使用OpenGL进行绘图需要将帧缓冲区的配置信息设置为与当前操作系统及硬件环境匹配的格式。这可以通过QSurfaceFormat类来实现。 然而,这条报错意味着Qt无法找到与当前qsurfaceformat匹配的fbconfig。可能原因包括:系统环境不支持所需的OpenGL版本、Qt版本过低、或者系统中没有正确的OpenGL驱动程序。 为了解决这个问题,可以尝试以下几个解决办法: 1. 确保系统环境符合要求:检查操作系统和硬件是否支持所需的OpenGL版本。应该升级或更换系统或硬件,以满足OpenGL的要求。 2. 更新Qt版本:确保使用的Qt版本符合OpenGL要求。升级Qt到更高的版本,可以修复一些与OpenGL相关的问题。 3. 安装正确的OpenGL驱动程序:在操作系统中安装正确的OpenGL驱动程序可以解决一些OpenGL相关的问题。可以从显卡厂商的官方网站或操作系统的官方支持渠道获取正确的驱动程序。 4. 检查OpenGL配置:确认使用Qt的代码中的OpenGL配置是否正确。可能需要检查使用的QSurfaceFormat对象的设置,并确保其与系统环境匹配。 总之,这个报错通常是由于系统环境或Qt配置问题导致的。通过检查系统环境、更新Qt版本、安装正确的驱动程序并确保OpenGL配置正确,可以尝试解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值