93. 复原IP地址;103. 二叉树的锯齿形层次遍历

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。

 

示例:

输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

class Solution {//回溯法
    vector<string>res;
    string sel;
public:
    vector<string> restoreIpAddresses(string s) {
        int sSize=s.size();
        if(sSize<4||sSize>12)return {};
        sel=s;
        helper(0,0,"");
        return res;
    }
    void helper(int start,int cnt,string path){//当前下标;当前第几个分块;路径
        if(cnt==4)
            if(start==sel.size()){//找到
                path.pop_back();//去除最后一个点‘.’
                res.push_back(path);
                return;
            }
            else return;//越界
        for(int i=1;i<=3&&start+i<=sel.size();++i){//依此检查sel.substr(start,i)是否满足
            if(i==2&&sel[start]=='0')break;//注意!!!两位数和三位数时,第一位不能为0
            if(i==3&&stoi(sel.substr(start,i))>255)break;//三位数时必须小于256         
            helper(start+i,cnt+1,path+sel.substr(start,i)+'.');
        }
    }
};

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7


返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(!root)return {};
        deque<TreeNode*>q;
        vector<vector<int>>res;
        q.push_back(root);
        bool front_back=true;//判断双端队列从那一头开始遍历,true则首端,false则尾端
        while(q.size()){
            int qSize=q.size();
            vector<int>path;
            while(qSize--)
                if(front_back){//首端出队,尾端入队,入队顺序:左子树-右子树
                    auto temp=q.front();
                    q.pop_front();
                    path.push_back(temp->val);
                    if(temp->left)
                        q.push_back(temp->left);
                    if(temp->right)
                        q.push_back(temp->right);
                }
                else{//尾端出队,首端入队,入队顺序:右子树-左子树
                    auto temp=q.back();
                    q.pop_back();
                    path.push_back(temp->val);
                    if(temp->right)
                        q.push_front(temp->right);
                    if(temp->left)
                        q.push_front(temp->left);                    
                }
            front_back=!front_back;
            res.push_back(path);
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章