LeetCode 723. Candy Crush
原题链接在这里:https://leetcode.com/problems/candy-crush/
题目:
This question is about implementing a basic elimination algorithm for Candy Crush.
Given a 2D integer array board representing the grid of candy, different positive integers board[i][j] represent different types of candies. A value of board[i][j] = 0 represents that the cell at position (i, j) is empty. The given board represents the state of the game following the player's move. Now, you need to restore the board to a stable state by crushing candies according to the following rules:
- If three or more candies of the same type are adjacent vertically or horizontally, "crush" them all at the same time - these positions become empty.
- After crushing all candies simultaneously, if an empty space on the board has candies on top of itself, then these candies will drop until they hit a candy or bottom at the same time. (No new candies will drop outside the top boundary.)
- After the above steps, there may exist more candies that can be crushed. If so, you need to repeat the above steps.
- If there does not exist more candies that can be crushed (ie. the board is stable), then return the current board.
You need to perform the above rules until the board becomes stable, then return the current board.
Example:
Input:
board =
[[110,5,112,113,114],[210,211,5,213,214],[310,311,3,313,314],[410,411,412,5,414],[5,1,512,3,3],[610,4,1,613,614],[710,1,2,713,714],[810,1,2,1,1],[1,1,2,2,2],[4,1,4,4,1014]] Output:
[[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[110,0,0,0,114],[210,0,0,0,214],[310,0,0,113,314],[410,0,0,213,414],[610,211,112,313,614],[710,311,412,613,714],[810,411,512,713,1014]] Explanation:

Note:
- The length of
boardwill be in the range [3, 50]. - The length of
board[i]will be in the range [3, 50]. - Each
board[i][j]will initially start as an integer in the range [1, 2000].
题解:
There are two steps.
Step 1: Mark 3 adjacent candies. Check if there are 3 adjacent candies. First check row by row, then column by column.
If there are, mark these values as negative.
Step 2: Crush them. Rewrite board with only positive numbers.
If there is crushing, that means there may be another round of crash, use recursion. Otherwise, there wouldn't be another round of crash, return the board.
Time Comlexity: O(M^2*n^2). m = board.length. n = board[0].length.
Each crash, there would be 3 crashed at minimum. Totally there are m*n candies. So recursion could run for m*n/3 times.
Each recursion, it takes O(m*n).
Space: O(1).
AC Java:
class Solution {
public int[][] candyCrush(int[][] board) {
if(board == null || board.length == 0 | board[0].length == 0){
return board;
}
boolean todo = false;
int m = board.length;
int n = board[0].length;
for(int i = 0; i<m; i++){
for(int j = 0; j<n-2; j++){
int val = Math.abs(board[i][j]);
if(val!=0 && val==Math.abs(board[i][j+1]) && val==Math.abs(board[i][j+2])){
todo = true;
board[i][j] = board[i][j+1] = board[i][j+2] = -val;
}
}
}
for(int j = 0; j<n; j++){
for(int i = 0; i<m-2; i++){
int val = Math.abs(board[i][j]);
if(val!=0 && val==Math.abs(board[i+1][j]) && val==Math.abs(board[i+2][j])){
todo = true;
board[i][j] = board[i+1][j] = board[i+2][j] = -val;
}
}
}
for(int j = 0; j<n; j++){
int br = m-1;
for(int i = m-1; i>=0; i--){
if(board[i][j] > 0){
board[br--][j] = board[i][j];
}
}
while(br>=0){
board[br--][j] = 0;
}
}
return todo ? candyCrush(board) : board;
}
}
LeetCode 723. Candy Crush的更多相关文章
- [LeetCode] 723. Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- [LeetCode] 723. Candy Crush 糖果粉碎
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- 【LeetCode】723. Candy Crush 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 日期 题目地址:https://leetcode ...
- [LeetCode] Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- [LeetCode][Java]Candy@LeetCode
Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- (LeetCode 135) Candy N个孩子站成一排,给每个人设定一个权重
原文:http://www.cnblogs.com/AndyJee/p/4483043.html There are N children standing in a line. Each child ...
- LeetCode 135 Candy(贪心算法)
135. Candy There are N children standing in a line. Each child is assigned a rating value. You are g ...
- 【leetcode】Candy(hard) 自己做出来了 但别人的更好
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- 【leetcode】Candy
题目描述: There are N children standing in a line. Each child is assigned a rating value. You are giving ...
随机推荐
- Visual Studio Code (vscode) 配置 C / C++ 环境
Visual Studio Code (vscode) 配置 C / C++ 环境 昨天突发奇想,想使用vscode配置C++环境,因为不想下载 Dev OR codeblock,然后借助了很多网上教 ...
- PHP下载远程图片到本地的几种方法总结(tp5.1)
1.CURL 2.使用file_get_contents 3.使用fopen 参考链接:https://www.jb51.net/article/110615.htm
- C# 快捷键(总结)
C# 展开和折叠代码的快捷键 VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...
- Java 中文转换拼音工具
Java 中文转换拼音工具 /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p&g ...
- 1014 福尔摩斯的约会(C#)
一.题目内容: 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就 ...
- json_rpc_2 implementation
https://stackoverflow.com/questions/52670255/flutter-json-rpc-2-implementation import 'dart:convert' ...
- JAVA - @WebServlet的使用方法
在servlet3.0以后,我们可以不用再web.xml里面配置servlet,只需要加上@WebServlet注解就可以修改该servlet的属性了. 下面是@WebServlet的属性列表. 属性 ...
- Windows环境下的MYSQL5.7配置文件定位
1.MYSQL安装目录 select @@basedir; 2.MYSQL数据文件目录 select @@datadir; 3.相应地,配置文件在数据文件上一级目录中 4.停止MYSQL服务 net ...
- PHP中的十进制、八进制、二进制、十六进制
我们平时用的都是十进制. 比如:987这个数字,其本质就是7*10^0+8*10^1+9*10^2 个位数上的7,1就是1,十位上的8,1就是10,百位上的9,1是100 echo '<br&g ...
- HTML&CSS基础-html常用的标签
HTML&CSS基础-html常用的标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html的源代码 <!DOCTYPE html> <html& ...