Valid Sudoku & Subsets I&&II & Flatten Binary Tree to Linked List & Jump Game I&&II

(1) Valid Sudoku

就是每一行,每一列,每一个方块的check,还有一种简化版[1]:

class Solution {
public:
    bool isValidSudoku(vector<vector<char> > &board) {
        int row[9],col[9],area[9];
        
        for(int i=0;i<9;i++)
        {
            memset(row,0,9*sizeof(int));
            memset(col,0,9*sizeof(int));
            
            for(int j=0;j<9;j++)
            {
                if(board[i][j]!='.')
                {
                    if(row[board[i][j]-'1']>0)
                        return false;
                    else
                        row[board[i][j]-'1']++;
                }
                
                if(board[j][i]!='.')
                {
                    if(col[board[j][i]-'1']>0)
                        return false;
                    else
                        col[board[j][i]-'1']++;
                }
            }
        }
        
        for(int i=0;i<9;i+=3)
            for(int j=0;j<9;j+=3)
            {
                memset(area,0,9*sizeof(int));
                for(int k=0;k<3;k++)
                    for(int l=0;l<3;l++)
                        if(board[i+k][j+l]!='.')
                        {
                            if(area[board[i+k][j+l]-'1']>0)
                                return false;
                            else
                                area[board[i+k][j+l]-'1']++;
                        }
            }
        return true;
    }
};

(2) Subsets

DFS每次返回当前解,当解深度大于最大深度时返回:

class Solution {
private:
    void solve(int dep, int maxDep, vector<int> tmp,vector<int> S,vector<vector<int>> &ret, int begin){
        ret.push_back(tmp);
        if(dep==maxDep)
            return;

        for(int i=begin;i<S.size();i++)
        {
            vector<int> a(tmp);
            a.push_back(S[i]);
            solve(dep+1,maxDep,a,S,ret,i+1);
        }
    }

public:
    vector<vector<int> > subsets(vector<int> &S) {
        vector<vector<int>> ret;
        vector<int> tmp;
        tmp.clear();
        sort(S.begin(),S.end());
        solve(0,S.size(),tmp,S,ret,0);
        return ret;
    }
};

(3) Subset II

比(2)多一个检查是否重复的判断:

class Solution {
private:
    void solve(int dep, int maxDep, vector<int> tmp,vector<int> S,vector<vector<int>> &ret, int begin){
        ret.push_back(tmp);
        if(dep==maxDep)
            return;

        for(int i=begin;i<S.size();i++)
        {
            vector<int> a(tmp);
            
            if(i>begin)
            {
                if(S[i]>S[i-1])
                {
                    a.push_back(S[i]);
                    solve(dep+1,maxDep,a,S,ret,i+1);
                }
            }
            else
            {
                a.push_back(S[i]);
                solve(dep+1,maxDep,a,S,ret,i+1);
            }
        }
    }

public:
    vector<vector<int> > subsetsWithDup(vector<int> &S) {
        vector<vector<int>> ret;
        vector<int> tmp;
        tmp.clear();
        sort(S.begin(),S.end());
        solve(0,S.size(),tmp,S,ret,0);
        return ret;
    }
};

(4) Flatten Binary Tree to Linked List

非递归后序遍历:

class Solution {
public:
    void flatten(TreeNode *root) {
        if(!root)
            return;
        stack<TreeNode *> stk;
        TreeNode *preNode=NULL,*curNode=NULL;  
        stk.push(root);
        
        while(!stk.empty())
        {
            curNode=stk.top();
            stk.pop();
            
            if(preNode)
            {
                preNode->left=NULL;
                preNode->right=curNode;
            }
            
            preNode=curNode;
            if(curNode->right)
                stk.push(curNode->right);
            if(curNode->left)
                stk.push(curNode->left);
        }
    }
};

(5) Jump Game 

只用关心最远能跳到什么地方[2]:

class Solution {
public:
    bool canJump(int A[], int n) {
        if(n==0)
            return false;
        int maxPos=A[0];
        
        for(int i=0;i<=min(maxPos,n-1);i++)
            maxPos=max(maxPos,i+A[i]);
        
        return maxPos>=n-1;
    }
};

(6) Jump Game II

根据[3]:

class Solution {
public:
    int jump(int A[], int n) {
        int jump[n];
        int maxJump=0;
        
        memset(jump,0,n*sizeof(int));
        
        for(int i=0;i<n;i++)
        {
            for(int j=maxJump-i+1;j<=A[i] && i+j<n;j++)
                jump[i+j]=jump[i]+1;
            
            maxJump=max(maxJump,i+A[i]);
        }
        return jump[n-1];
    }
};


参考:

[1]http://blog.csdn.net/doc_sgl/article/details/13002461

[2]http://blog.csdn.net/pickless/article/details/9855891

[3]http://blog.csdn.net/pickless/article/details/9776661

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值