首页 > 编程语言 >算法训练day30 LeetCode93.78.90

算法训练day30 LeetCode93.78.90

时间:2023-10-12 22:55:06浏览次数:47  
标签:used return LeetCode93.78 nums int day30 vector result 90

算法训练day30 LeetCode93.78.90

93.复原IP地址

题目

93. 复原 IP 地址 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 使用'.'切割字符串、结束条件为字符串中有三个'.'、同时要确定字符串符合的条件

    • 长度为不为1时,首字符不能是0
    • 数值大小在[0,255]
    • 单个字符在'0'~'9'
  • class Solution
    {
    private:
        vector<string> result; // 记录结果
        void backtracking(string &s, int startIndex, int pointNUm)
        {
            if (pointNUm == 3)		//结束条件:有三个'.',并且最后的字符串合法
            {
                if (isValid(s, startIndex, s.size() - 1))
                {
                    result.push_back(s);
                }
                return;
            }
            for (int i = startIndex; i < s.size(); i++)	//遍历各种切割长度组合
            {
                if (isValid(s, startIndex, i))		//当子字符串合法 
                {
                    s.insert(s.begin() + i + 1, '.');	//切割
                    pointNUm++;
                    backtracking(s, i + 2, pointNUm);	//并判断后面的子字符串
                    pointNUm--;						//回溯
                    s.erase(s.begin() + i + 1);
                }
                else
                    break;
            }
        }
        bool isValid(const string &s, int start, int end)	//字符串是否合法
        {
            if (start > end)
            {
                return false;
            }
            if (s[start] == '0' && start != end)	//长度大于1 首字符不为0
                return false;
            int num = 0;
            for (int i = start; i <= end; i++)
            {
                if (s[i] > '9' || s[i] < '0')		//单个字符合法
                    return false;
                num = num * 10 + (s[i] - '0');
                if (num > 255)						//值在[0,255]
                    return false;
            }
            return true;
        }
    
    public:
        vector<string> restoreIpAddresses(string s)
        {
            result.clear();
            if (s.size() < 4 || s.size() > 12)
                return result;
            backtracking(s, 0, 0);
            return result;
        }
    };
    

78.子集

题目

78. 子集 - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 子集中元素的数目是0~n,与切割和组合的区别是除了收集叶子结点外,其他各结点的结果也要收集

  • class Solution
    {
    private:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking(vector<int> &nums, int startIndex)
        {
            result.push_back(path);	//提前收集,防止遗漏
            if (startIndex >= nums.size())	//结束的条件是待选择元素集已经遍历完
            {
                return;
            }
            for (int i = startIndex; i < nums.size(); i++)	//横向遍历不同组合
            {
                path.push_back(nums[i]);
                backtracking(nums, i + 1);
                path.pop_back();	//回溯
            }
        }
    
    public:
        vector<vector<int>> subsets(vector<int> &nums)
        {
            result.clear();
            path.clear();
            backtracking(nums, 0);
            return result;
        }
    };
    

90.子集II

题目

90. 子集 II - 力扣(LeetCode)

题解

代码随想录 (programmercarl.com)

  • 集合中有重复元素,并且子集不能重复,需要在树层去重

    • 去重采用used数组标记集合中对应数字是否使用,默认标记为已使用,可以较方便的实现后出现重复元素的确认
    class Solution
    {
    private:
        vector<vector<int>> result;
        vector<int> path;
        //used为元素是否使用标记数组
        //used[i]==false 意味着i-1元素在树层被使用过
        //used[i]==true 意味着i-1元素在树枝被使用过
        void backtracking(vector<int> &nums, int startIndex, vector<bool> &used)
        {
            result.push_back(path);
            for (int i = startIndex; i < nums.size(); i++) //横向选择剩余元素
            {
                if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)
                    continue;			//同层使用过,跳过
                path.push_back(nums[i]);
                used[i] = true;
                backtracking(nums, i + 1, used);
                used[i] = false;		//回溯
                path.pop_back();
            }
        }
    
    public:
        vector<vector<int>> subsetsWithDup(vector<int> &nums)
        {
            result.clear();
            path.clear();
            vector<bool> used(nums.size(), false);
            sort(nums.begin(), nums.end());
            backtracking(nums, 0, used);
            return result;
        }
    };
    

标签:used,return,LeetCode93.78,nums,int,day30,vector,result,90
From: https://www.cnblogs.com/High-source/p/17760820.html

相关文章

  • CF908D New Year and Arbitrary Arrangement 题解
    NewYearandArbitraryArrangement思路:期望题果然还是恶心呀!我们设\(f[i][j]\)表示当串中有\(i\)个\(a\)和\(j\)个\(ab\)时的方案数。为了方便,设\(A=\dfrac{P_a}{P_a+P_b},B=\dfrac{P_b}{P_a+P_b}\)。显然,可以这样转移:\[f[i][j]=f[i+1][j]\timesA+f[i][i+j]\ti......
  • 宏蜂窝基站便携测试设备设计原理图:FMCJ450-基于ADRV9009的双收双发射频FMC子卡
    FMCJ450-基于ADRV9009的双收双发射频FMC子卡一、板卡概述       ADRV9009是一款高集成度射频(RF)、捷变收发器,提供双通道发射器和接收器、集成式频率合成器以及数字信号处理功能。这款IC具备多样化的高性能和低功耗组合,FMC子卡为2路输入,2路输出的射频收发卡,......
  • 1790_给通过USB连接到树莓派的NTFS硬盘设置固定的挂载名称
            全部学习汇总:GreyZhang/little_bits_of_raspberry_pi:myhackingtripaboutraspberrypi.(github.com)        我用过好几个树莓派形式的单板电脑,但是遇到过磁盘挂载位置不确定的时候。有些甚至不会自动挂载。这些行为跟对应的OS的行为是相关的,而我......
  • MT8390安卓核心板参数_联发科Genio 700智能模组
    MT8390安卓核心板是一款功能强大且高度集成的平台,专为广泛的人工智能(AI)和物联网(IoT)应用案例而设计。它具备高性能边缘处理、先进的多媒体和连接能力、多个高分辨率摄像头、连接的触摸屏显示以及多任务高级操作系统的使用。MT8390安卓核心板采用高性能的八核应用处理器,......
  • Codeforces Round 902 Div 1 (CF 1876)
    A.HelmetsinNightLight按花费sort一下,\(b<p\)就让他用\(b\)的花费告诉别人,剩下的人一开始用\(p\)的花费告诉即可。B.EffectsofAntiPimples发现一个数会被所有它的因数贡献,\(O(n\sqrt{n})\)随便算一算,式子略。C.AutosynthesisSolution1想到了建图但没有完......
  • Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1877。呜呜铃果唱歌太好听了、、、我宣布是第二喜欢的声线,第三喜欢是东北切蒲英,第一喜欢绝赞招募中。这下不得不成为数码推了、、、A答案为\(-\suma_i\)。懒得写代数式子推了,赛时看完题直接......
  • Codeforces Round 902 (Div. 2) C. Joyboard 规律
    CodeforcesRound902(Div.2)C.Joyboard//思路:在k=1,k=2,k=3时有解//当k=1时为全0//当k=2时,若m>=n,则先是0然后为1~n,最后一位可以为n的倍数也符合,即n+m/n-1//若m<n则为1~m即m//当k=3时,只能在n+1位是第3个不同情况(大于n),且不能为n的倍数,即(m-n)-(m/n-1)//只......
  • [903] Concatenate (merge) multiple dictionaries in Python
    Toconcatenate(merge)multipledictionariesinPython,youcanusevariousmethodsdependingonyourPythonversionandpreferences.Herearesomecommonapproaches:1.Usingtheupdate()Method:Youcanusetheupdate()methodofdictionariestomergeo......
  • [900] Print an empty line of CMD batch scripts
    Usetheecho.commandtoprintanemptyline.@echooffechoThisisalineoftextecho.echoThisisanewlineoftextThiswillproducetheoutput:ThisisalineoftextThisisanewlineoftextUsingecho.isacommonmethodforprintingnewline......
  • [901] Reuse variables of CMD batch scripts
    Inabatchfile,youcanreuseavariabletogeneratedifferentfilepathsbyconcatenatingthevariablewithotherstringsorvariables.Here'sanexampleofhowtodothis:@echooffset"base_path=C:\Example"REMGeneratefilepathsus......