题目
生命游戏
给定一个包含 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
学习到的主要就是二进制的妙用吧、还有空这个数据的测试。