leecode第十五题(三数之和)

本文介绍了一种求解三数之和为零的有效算法。通过快速排序和双指针技术,实现对数组的有效遍历,并有效避免重复解。讨论了不同指针移动策略对解决问题的影响。

 

class Solution {
public:
    void quick_order(vector<int>& num, int star, int en)//快排
    {
        int start = star;
        int end = en;
        if (start >= end)
            return;

        int index = num[start];//就第一个设为阈值
        while (start < end)
        {
            while (start < end && index <= num[end])//先看右边,把第一个小于index数找出
                end--;

            int temp1 = num[start];//交换
            num[start] = num[end];
            num[end] = temp1;

            while (start < end && index >= num[start])//再看右边,把第一个大于index的数找出
                start++;

            int temp2 = num[start];//交换
            num[start] = num[end];
            num[end] = temp2;
        }

        quick_order(num, star, start-1);//分左右子集迭代
        quick_order(num, start + 1, en);
        return;
    }
    
    vector<vector<int>> threeSum(vector<int>& nums) {        
        int len=nums.size();
        vector<vector<int>> res;
        
        if(len==0)//输入判断
            return res;
        
        int start=0,end=len-1;
        quick_order(nums,start,end);//快排
        
        vector<vector<int>> v2;
        for (int c = nums.size()-1; c >= 2; ){
            for (int a = 0, b = c-1; a < b; ){
                int tmp_sum = nums[a]+nums[b];
                if (tmp_sum < -nums[c]){
                    ++a;
                } else if (tmp_sum > -nums[c]){
                    --b;
                } else {
                    vector<int> v = {nums[a], nums[b], nums[c]};
                    v2.push_back(v);
                    do{//去重复 a b
                        ++a;
                    } while (a < b && nums[a-1] == nums[a]);
                    do{
                        --b;
                    } while (a < b && nums[b+1] == nums[b]);
                }
            }
            do{//去重复 c
                --c;
            } while (c >= 2 && nums[c+1] == nums[c]);
        }
        return v2;

     /*for(int fir=1;fir<len-1;fir++)
        {
            int sec=fir-1,thr=fir+1;
            while(sec>=0 && thr<=len-1)
            {
                int sum=nums[fir]+nums[sec]+nums[thr];
                if (sum==0)
                {
                    vector<int> node={nums[sec],nums[fir],nums[thr]};
                    bool flag=true;
                    for(int i=0;i<res.size();i++)
                    {
                        if(node==res[i])
                            flag=!flag;
                    }
                    if(flag)
                        res.push_back(node);
                    sec = sec - 1;
                }
                else if (sum>0)
                    sec=sec-1;
                else if (sum<0)
                    thr=thr+1;
            } 
        }
        
        return res;*/
    }

};

 

分析:

不写代码永远不知道自己有多菜,一个快排写的我哭了,然后说主要思想:

未注释的是别人的代码,排序后,令【a,。。。。,b,c】这种形式,让c从右往左遍历,a初始化为0,从左向右移动,b初始化c-1,从右往左移动。在c遍历中,计算a+b,若a+b<-c,说明a太小了,a++,若a+b>-c,说明b大了,b--。最让我值得学习的是去重复,其实不难,就是a,b,c在各自道路上有重复就前进。

注释的是我自己的想法,排序后,令【。。。a,b,c,。。。】这种形式,b从左向右遍历,a初始化b-1,从b往左移动,c初始化b+1,从b往右移动。在b遍历中,计算a+c,若a+b+c>0,a--,若a+b+c<0,b++。这里已经实现了除去重复所有功能,且时间复杂度和上面一样,但是就在去重复这里我懵了,我先按查找已被选择的三数,但是碰到一个变态长的数组,时间复杂度蹭蹭的上涨,然后我就分析重复情况,有两个例子【-1,0,0,1】和【-2,-1,-1,0,1,2】,一个是【【-1,0,1】】,一个是【【-1,-1,2】,【-1,0,1】】,这里面如果你让b跳过重复的,那就错过后面案例的【-1,-1,2】,如果不跳过,前面案例就会重复,搞的我又一点点分析,但是真的好难写,难写在于解决一个情况,但是又有新的情况,二者特矛盾,有一没二那种,后来代码越写越长,还丑,我就只能捂着脸学习别人的思想了。

下次再碰到想到中间指针时候,想想指针从后向前或从前向后的情况。

转载于:https://www.cnblogs.com/CJT-blog/p/10582573.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值