leetcode数据结构入门day5 | 36.有效数独 73. 矩阵置零

文章介绍了如何使用哈希表有效地检查数独的正确性,通过遍历一次数独矩阵,记录每行、每列和每个小九宫格中数字的出现次数。同时,提出了矩阵置零的解决方案,通过标记数组避免多余的置零操作,只需两次遍历即可完成。
摘要由CSDN通过智能技术生成

36.有效数独

可以使用哈希表记录每一行、每一列、每一个小九宫格中,每个数字出现的次数。

只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,并判断是否满足有效的数独的条件即可。

对于数独的第 i 行第 j 列的单元格,该单元格所在的小九宫格的行数和列数分别为 [i/3]和[j/3]。

http://t.csdn.cn/RcPWjhttp://t.csdn.cn/RcPWj

//原始思想:遍历每行每列每格装在set里
//其实:先全部遍历装在哈希表里,然后再看,也就是一次遍历
//关键:怎么很方便的在遍历的时候,填入哈希表,也就是判断数字在哪一个九宫格

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<set<int>> row(9);
        vector<set<int>> column(9);
        vector<set<int>> box(9);

        for(int i=0;i<9;++i){
            for(int j=0;j<9;++j){

                int temp=board[i][j]-'0';
                if(temp<0||temp>9) continue;
                
                if(column[j].count(temp)) return false;
                else column[j].insert(temp);

                if(row[i].count(temp)) return false;
                else row[i].insert(temp);

                int index=(3*(i/3)+j/3);
                if(box[index].count(temp)) return false;
                else box[index].insert(temp);
            }
        }
        return true;
    }
};

某个数 x + ’ 0 ’ 就是指将x转变为字符型
某个数 x - ’ 0 ’ 就是指将x转变为整型

自己只想到了暴力遍历,还因为不知道怎么比较数字字符、怎么确定数字所在字符块,难以动笔,最后借鉴了评论区大佬的写法,结果运行堆溢出了QWQ。

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
    for(int i=0;i<board.size();i++){
        for(int j=0;i<board[i].size();j++){
            if(board[i][j]>='0'&&board[i][j]<='9'){
                if(!getEffective(i,j,board)){
                    return false;
                }
            }
        }
    }
    return true;       
    }

    bool getEffective(int i,int j,vector<vector<char>>board){
        for(int k=0;k<board[i].size();k++){
            if(board[i][k]==board[i][j]&&k!=j){
                return false;
            }
        }

        for(int k=0;k<board.size();k++){
            if(board[k][j]==board[i][j]&&k!=i){
                return false;
            }
        }

        int length=(i/3)*3;
        int width=(j/3)*3;

         for(int k1=length;k1<length+3;k1++){
             for(int k2=width;k2<width+3;k2++){
                 if(board[k1][k2]==board[i][j]&&(k1!=i&&k2!=j)){
                     return false;
                 }
             }
         }
         return true;
    }
};

73. 矩阵置零

使用标记数组。

(自己只想到了碰到0就换,导致多置了0)

可以用两个标记数组分别记录每一行和每一列是否有零出现。

 首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后再次遍历该数组,用标记数组更新原数组即可。(更新时行列数组可以一起)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值