左右双指针 - nSum问题

news/2023/6/6 23:40:29

    vector<vector<int>> twoSum(vector<int> &nums, int start, int target){
        //思路,先进行排序,然后利用收尾双指针的方法获取值元素
        //总的时间复杂度:排序 max(nlog(n), n) = nlog(n)
        vector<vector<int>> res;
        if(nums.size() < 2) return res;

        sort(nums.begin(), nums.end());

        int i = start, j = nums.size() - 1;
        while(i < j){
            int a = nums[i], b = nums[j];
            int c = a + b;
            if(c < target) while(++i < j && nums[i] == a);
            else if(c > target) while(--j > i && nums[j] == b);
            else{
                //符合条件,保存结果
                vector<int> v{a, b};
                res.push_back(v);
                //结果去重
                while(++i < j && nums[i] == a);
                while(--j > i && nums[j] == b);
            }
        }
        return res;
    }

    vector<vector<int>> threeSum(vector<int> &nums, int target){
        //思路可以利用 twoSum 的结果,时间复杂度 n^2
        vector<vector<int>> res;
        if(nums.size() < 3) return res;

        sort(nums.begin(), nums.end());

        while(i < nums.size()){
            int a = nums[i];
            vector<vector<int>> t = twoSum(nums, i + 1, target - a);  //注意函数里面去掉sort排序
            for(auto v:t){
                v.push_back(a);
                res.push_back(v);
            }
            while(++i < nums.size() && nums[i] == a);
        }

        return res;
    }


    vector<vector<int>> nSum(vector<int>& nums, int start, int n, long target) {
        //回头看看 3sum 利用 2sum的关系,应该可以用递归来实现 nSum 的问题
        //调用该函数前,需要先调用sort对nums排序
        vector<vector<int>> res;
        if(start < 0 || start >= nums.size() || n < 2 || n > nums.size()){
            return res;
        }
        int i = start, j = nums.size() - 1;
        if(n == 2) {
            //递归返回条件
            while(i < j) {
                int a = nums[i], b = nums[j];
                int c = a + b;
                if(c < target){
                    while(++i < j && nums[i] == a);
                }else if(c > target){
                    while(--j > i && nums[j] == b);
                }else {
                    vector<int> v{a, b};
                    res.push_back(v);
                    while(++i < j && nums[i] == a);
                    while(--j > i && nums[j] == b);
                }
            }
        }else{
            //递归手法
            int k = start;
            while(k < nums.size()){
                int a = nums[k];
                vector<vector<int>> v = nSum(nums, k + 1, n - 1, target - a);
                for(auto &elem : v){
                    elem.push_back(a);
                    res.push_back(elem);
                }
                while(++k < nums.size() && nums[k] == a); //去重不要忘记
            }
        }
        return res;
    }

调用:

vector<vector<int>> fourSum(vector<int>& nums, int target) {

        sort(nums.begin(), nums.end());

        return nSum(nums, 0, 4, target);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4554355.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

晟辉论金:4.6黄金偏强震荡,晚间黄金走势分析!

看空不追空&#xff0c;看多不追多&#xff0c;但是我们经常在行情中用的一种方法就是破位追单&#xff0c;那么肯定会有人去问&#xff0c;老师你不是说不能追涨杀跌吗&#xff1f;那为什么还去追涨杀跌呢&#xff1f;这并不是矛盾的话题&#xff0c;我们知道&#xff0c;行情…

大胃王被禁了,自虐式测评呢?

文|琥珀消研社 作者|张元 就着死神辣条&#xff0c;一口气干一杯高度白酒&#xff0c;是一种怎样的体验&#xff1f; 前段时间&#xff0c;我看到了这样一条稿件——《挑战吃20根死神辣条》。出于人类猎奇的本能&#xff0c;我点了进去&#xff0c;一进去&#xff0c;就看见一…

金针探底技术分析(下)续

上篇分析了程序选出的具有下影线的18个上证股票&#xff0c;本篇分析深证和创业板的17个。 19.300149量子生物 位置较高&#xff0c;而且这个实体太长&#xff0c;不知是否有啥利好出来造成的。 20.300260 新莱应材 位置较高&#xff0c;昨天长上影&#xff0c;不属于探底&am…

金针探底技术分析(下)

上篇文章介绍了如何利用程序获取具有长下影线的股票&#xff0c;本文就利用历史数据实战一下&#xff0c;这里选择4月27的数据进行分析&#xff0c;这一天上证、深证、创业板都走了下影线&#xff0c;可以选出更多的股票。距离现在快过去三个月了&#xff0c;也算是个短中线周期…

金针探底技术分析(上)

之前的两篇文章介绍了如何获取股票代码&#xff0c;如何用股票代码获取股票数据&#xff0c;有了股票数据我们就可以做一些简单的分析了。本篇介绍比较简单的一种技术&#xff1a;金针探底。关于金针探底的详细介绍可以网上去找&#xff0c;大致意思就是股票在下跌过程中突然出…

Chrome浏览器,有道云笔记的网页剪报需要多次登录且收藏失败报错

报错代码 {"canTryAgain":false,"scope":"SECURITY","error":"207","message":"Message[AUT客服给出的方案&#xff0c;经测试有效 新版的chrome浏览器&#xff0c;地址栏输入&#xff1a; chrome://flags/…

有道云笔记新功能发现——有道云笔记剪报,完美解决不开会员保存csdn博客到本地的问题。...

怎么用 方法一&#xff1a;谷歌插件 方法二&#xff1a;http://note.youdao.com/web-clipper-chrome.html 添加到书签 功能&#xff1a; 能够把网页浏览的内容保存到有道云笔记 解决了自己的难题 之前一直想保存csdn的博客到笔记中&#xff0c;可是是行不通的&#xff0c;第一点…

关于剪报插件在新版本Chrome浏览器下不能使用的解决方案(最新)

下载最新版本的Chrome浏览器后发现&#xff0c;有道云笔记&#xff08;网页简报&#xff09;插件不能用了&#xff0c;看了简书和CSDN上的解决办法都不能用&#xff0c;经过仔细的查找&#xff0c;终于找到根本解决办法&#xff0c;如下所示&#xff1a; 建议按照以下步骤操作试…