初级算法-数组(续)

在刷题时遇到了一道值得纪念的题目

http://链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2f9gg/

这道题目一般思路:创建三个二维数组,分别记录行,列,九宫格的数字,因为数字较少,所以可以采用桶排序判断是否重复出现。思路比较简单,代码如下:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int num,box;
        int row[10][10]={0};
        int column[10][10]={0};
        int jiu[10][10]={0};
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j]=='.') continue;
                else{
                    num=board[i][j]-'0'-1;
                    box=i/3*3+j/3;
                    if(row[i][num]!=0||column[j][num]!=0||jiu[box][num]!=0)  return false;
                    row[i][num]=1;
                    column[j][num]=1;
                    jiu[box][num]=1;
                    
                } 
                 
            }
        }
        return true;
    }
};

其中 box=i/3*3+j/3是在求当前的坐标在第几个九宫格内,可以简单理解 i/3 三行一划分,j/3三列一划分,但是如果简单相加肯定不对,再接着向下推导(哪怕简单试试也很容易试到),其中也等价于box=i/3+j/3*3;

原本以为本题结束了,一看题解,我竟然看到了位运算!!!

其一二维数组优化为了一维数组,

其二运用的左移运算,与或运算真的相当巧妙,

位运算总能给人惊喜!!!!

思路如下:

数据存储:比如9那就是1左移八位(自己定)

100000000

连续记录数据就是或运算,比如下一个数字是4,结果就为

100001000

怎么比较有没有重复出现呢,很多人应该猜到了,就是与运算,如果结果大于0就是存在,否则不存在。

代码如下

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int row[10]={0};
        int column[10]={0};
        int box[10]={0};
        int num,c;
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board.size();j++){
                if(board[i][j]=='.') continue;
                c=i/3+j/3*3;
                num=1 << (board[i][j]-'0'-1);
                if((row[i]&num)>0||(column[j]&num)>0||(box[c]&num)>0){
                    return false;
                }
                row[i] |=num;
                column[j] |= num;
                box[c] |= num;
            }
        }
        return true;
    }
};

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值