算法——生命游戏与电话号码的字母组合(M)

题目

生命游戏

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0
即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡; 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/game-of-life
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
这里是引用

问题分析

对于生命游戏,就是模拟的方法,一般遍历即可,再采用二进制运算提高效率和免去复制操作。
对于字母组合,就是排列组合问题,递归回溯即可。

题解

生命游戏
Python
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        op = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
        m = len(board)
        n = len(board[0])
        for i in range(m):
            for j in range(n):
                tsum = 0
                for opitem in op:
                    tx = i + opitem[0]
                    ty = j + opitem[1]
                    if 0 <= tx < m and 0 <= ty < n:
                        tsum += board[tx][ty] & 1
                if (board[i][j]&1 == 1) and 2 <= tsum <= 3:
                    board[i][j] += 2
                elif tsum == 3:
                    board[i][j] += 2
                else:
                    pass
        for i in range(m):
            for j in range(n):
                board[i][j] = board[i][j] >> 1
C++
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        // op = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
        int dx[] = {-1,-1,-1,0,0,1,1,1};
        int dy[] = {-1,0,1,-1,1,-1,0,1};
        int m = board.size();
        int n = board[0].size();
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                int tsum = 0;
                for(int t = 0; t < 8; t++){
                    int tx = i + dx[t];
                    int ty = j + dy[t];
                    if(tx >= 0 and tx < m and ty >= 0 and ty < n){
                        tsum += board[tx][ty] & 1;
                    }
                }
                if(tsum == 3){
                    board[i][j] += 2;
                }else if(board[i][j] & 1 == 1 and tsum == 2){
                    board[i][j] += 2;
                }
            }
        }
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                board[i][j] = board[i][j] >> 1;
            }
        }
    }
};
运行结果

在这里插入图片描述

字母组合
Python
class Solution:
    digitmap = {'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],'6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
    def letterCombinations(self, digits: str) -> List[str]:
        self.n = len(digits)
        self.digits = digits
        self.ans = []
        self.tempans = ''
        self.dfs(0)
        return self.ans
    
    def dfs(self, idc):
        if idc == self.n:
            if idc > 0:
                self.ans.append(self.tempans)
            else:
                return
        else:
            for i in self.digitmap[self.digits[idc]]:
                self.tempans += i
                self.dfs(idc+1)
                self.tempans = self.tempans[:-1]
C++

放一个双100%的题解

class Solution {
public:
    vector<string> solvers;

    vector<string> letterCombinations(string digits) {
        if (digits.empty())
        {
            return{};
        }

        vector<string> letter_map = { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
        string solver;

        allsequence(digits, letter_map, 0, solver);

        return solvers;
    }

    void allsequence(string &digits, vector<string> &letter_map, int step, string &solver)
    {
        if (step == digits.size())
        {
            solvers.push_back(solver);
            return;
        }

        int index = digits[step] - '0' - 2;
        string s = letter_map[index];
        for (int i = 0; i < (int)s.size(); i++)
        {
            solver.push_back(letter_map[index][i]);
            allsequence(digits, letter_map, step + 1, solver);
            solver.erase(solver.end() - 1);
        }
    }
};

作者:jiangtianyu007
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/quan-pai-lie-de-di-gui-tong-fa-cshuang-100-by-jian/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

学习到的主要就是二进制的妙用吧、还有空这个数据的测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值