leetcode 150道题 计划花两个月时候刷完,今天(第十四天)完成了4道(29-32)150:
今天这是矩阵,真的全是模拟(我是菜狗。。),好恶心啊。
29.(有效的数独) 题目描述:
bash
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
第一版(真的要看清除题,我之前没注意,以为输入的不一定是9×9的,后面判断小方块时候有点棘手,看了题目才发现是固定9×9的。。,我是纯模拟做的。)
java
class Solution {
public boolean isValidSudoku(char[][] board) {
//数字 1-9 在每一行只能出现一次。
int len=board.length;
int[] key=new int[10];
for(int i=0;i<len;i++){
key=new int[10];
for(int j=0;j<len;j++){
int temp=board[i][j]-48;
if(temp>=0&&temp<=9){
if(key[temp]!=0){
return false;
}
key[temp]++;
}
}
}
//数字 1-9 在每一列只能出现一次。
for(int i=0;i<len;i++){
key=new int[10];
for(int j=0;j<len;j++){
int temp=board[j][i]-48;
if(temp>=0&&temp<=9){
if(key[temp]!=0){
return false;
}
key[temp]++;
}
}
}
//数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
int count=0;
key=new int[10];
for(int index=0;index<3;index++){
for(int i=0;i<len;i++){
for(int j=index*3;j<index*3+3;j++){
int temp=board[i][j]-48;
if(temp>=0&&temp<=9){
if(key[temp]!=0){
return false;
}
key[temp]++;
}
}
if(i%3==2){
key=new int[10];
}
}
}
return true;
}
}
30.(54. 螺旋矩阵)题目描述:
bash
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [
[1,2,3],
[4,5,6],
[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
第一版(这个我还是稍微想了想,用了一点点想法,虽然还是模拟,但是我感觉我这个比解题的方法要好很多。。)
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int left=0;
int right=0;
int start=matrix.length-1;
int end=matrix[0].length-1;
List<Integer> spiralOrder=new ArrayList();
while(left<=start&&right<=end){
if(left==start&&right==end){
spiralOrder.add(matrix[start][end]);
break;
}
// 一行
if(left==start){
for(;right<=end;right++){
spiralOrder.add(matrix[left][right]);
}
break;
}
// 一列
if(right==end){
for(;left<=start;left++){
spiralOrder.add(matrix[left][right]);
}
break;
}
// 一圈-》一行 一列 一行 一列
int temp=right;
//一行
for(;temp<=end;temp++){
spiralOrder.add(matrix[left][temp]);
}
temp=left+1;
//一列
for(;temp<=start;temp++){
spiralOrder.add(matrix[temp][end]);
}
temp=end-1;
// 一行
for(;temp>=right;temp--){
spiralOrder.add(matrix[start][temp]);
}
//一列
temp=start-1;
for(;temp>left;temp--){
spiralOrder.add(matrix[temp][right]);
}
left++;
right++;
start--;
end--;
}
return spiralOrder;
}
}
31.(48. 旋转图像)题目描述:
bash
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
第一版(这个是真的没想到不额外用数组怎么调换位置,看看我菜鸡第一版)
java
class Solution {
public void rotate(int[][] matrix) {
int len=matrix.length;
int[][] res=new int[len][len];
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
res[i][len-j-1]=matrix[j][i];
}
}
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
matrix[i][j]=res[i][j];
}
}
}
}
第二版(看了解题,真的太牛了还有公式。。但是就感觉最后一个先水平反转,再主对角线反转这个方法好)
java
class Solution {
public void rotate(int[][] matrix) {
int len=matrix.length;
//水平翻转
for(int i=0;i<len/2;i++){
for(int j=0;j<len;j++){
int temp=matrix[i][j];
matrix[i][j]=matrix[len-i-1][j];
matrix[len-i-1][j]=temp;
}
}
//主对角反转(/) 这个要好好理解,我反正一知半解
for(int i=0;i<len;i++){
for(int j=0;j<i;j++){
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
}
}
32.(73. 矩阵置零)题目描述:
bash
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
第一版(这个我感觉不是很难。。但是写完发现别人的这个想法是真的牛)
java
class Solution {
public void setZeroes(int[][] matrix) {
int len=matrix.length;
int with=matrix[0].length;
Set<Integer> rowSet=new HashSet();
Set<Integer> colSet=new HashSet();
for(int i=0;i<len;i++){
for(int j=0;j<with;j++){
if(matrix[i][j]==0){
rowSet.add(i);
colSet.add(j);
}
}
}
for(Integer row:rowSet){
for(int j=0;j<with;j++){
matrix[row][j]=0;
}
}
for(Integer col:colSet){
for(int i=0;i<len;i++){
matrix[i][col]=0;
}
}
}
}
第二版(来看看,大神的想法。。是真的佩服,boolean 还能这样用!!)
java
class Solution {
public void setZeroes(int[][] matrix) {
int len=matrix.length;
int with=matrix[0].length;
boolean[] rowSet=new boolean[len];
boolean[] colSet=new boolean[with];
for(int i=0;i<len;i++){
for(int j=0;j<with;j++){
if(matrix[i][j]==0){
rowSet[i]=true;
colSet[j]=true;
}
}
}
for(int i=0;i<len;i++){
for(int j=0;j<with;j++){
if(rowSet[i]||colSet[j]){
matrix[i][j]=0;
}
}
}
}
}
今天这些题太麻烦了,都需要找规律,但是还行能用笨办法写出来也是进步。
加油,早日跳槽!!!