Leetcode # 723. Candy Crush
- 2023.08.24
- ★★ Medium LeetCode nonlocal Variable Scope
Problem
https://leetcode.com/problems/candy-crush
Solution
one_turn() := find() + crush() + drop()
m, n := len(board), len(board[0])
Time Complexity: O(m * n)
Space Complexity: O(1)
(The input and output generally do not count towards the space complexity.)
class Solution: def candyCrush(self, board: List[List[int]]) -> List[List[int]]: m, n = len(board), len(board[0]) def one_turn(): crushed = False # crush def crush(i, j): board[i][j] = 0 nonlocal crushed crushed = True # find for i in range(m): pre_candy_j = 0 for j in range(1, n + 1): if j == n or board[i][j] != board[i][pre_candy_j]: if board[i][pre_candy_j] != 0 and j - pre_candy_j >= 3: for k in range(pre_candy_j, j): board[i][k] *= -1 pre_candy_j = j for j in range(n): pre_candy_i = 0 for i in range(1, m + 1): if i == m or abs(board[i][j]) != abs(board[pre_candy_i][j]): if board[pre_candy_i][j] != 0 and i - pre_candy_i >= 3: for k in range(pre_candy_i, i): crush(k, j) else: for k in range(pre_candy_i, i): if board[k][j] < 0: crush(k, j) pre_candy_i = i # drop p1 = m - 1 while p1 >= 0: if board[p1][j] != 0: p1 -= 1 continue p2 = p1 - 1 while p2 >= 0: if board[p2][j] != 0: break p2 -= 1 if p2 < 0: break board[p1][j], board[p2][j] = board[p2][j], 0 p1 -= 1 return crushed while one_turn(): pass # for row in board: print([str(candy).rjust(5) for candy in row]) return board
Last Updated on 2023/08/24 by A1go