leetcode36.有效数独--HashMap的处理方式

hashmap根据每行、每列、每个九宫格中出现的数值唯一,三个条件的检测中关键字都保证唯一才是有效的。

/**

  • 解题思路:
  • 首先必须理解有效数独的定义
  • 要知道是否满足数独的要求,肯定所有的点都得遍历到,所以得双重遍历
  • 在双重遍历中得匹配之前的遍历结果,看是否有重复的数字,考虑用hashmap报错遍历结果
  • hashmap中存储的key是有三种:行的index+数字、列的index+数字、3*3宫格的index+数字
  • 提交结果:
  • 执行用时 : 16 ms, 在Valid Sudoku的Java提交中击败了62.19% 的用户
  • 内存消耗 : 42.4 MB, 在Valid Sudoku的Java提交中击败了81.42% 的用户
  • 结果并不是很出色,看了其他优秀解法,发现他们存储是固定大小三个数组,
  • 仔细想想也是,HashMap虽然查找是O(1),但是扩容的时候是有时间消耗的,对于这种固定大小的可以考虑用数组进行优化
  • 官方解题,是分了三个HashMap,估计也是为了减少扩容的时间消耗吧
  • 作者:pphdsny
  • 链接:https://leetcode-cn.com/problems/valid-sudoku/solution/36-you-xiao-de-shu-du-javaha-xi-biao-by-pphdsny/
  • 来源:力扣(LeetCode)
  • 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    */
package com.company;

import java.util.HashMap;


//需要知道hashmap的特性,在查重方面的作用

public class leetCode36Hash {
    public static void main(String[] args) {
        leetCode36Hash hashlet = new leetCode36Hash();
        char[][] arr = new char[][]
                {
                        {'5', '3', '.', '.', '7', '.', '.', '.', '.'}, 
                        {'6', '.', '.', '1', '9', '5', '.', '.', '.'},
                        {'.', '9', '8', '.', '.', '.', '.', '6', '.'},
                        {'8', '.', '.', '.', '6', '.', '.', '.', '3'},
                        {'4', '.', '.', '8', '.', '3', '.', '.', '1'}, 
                        {'7', '.', '.', '.', '2', '.', '.', '.', '6'},
                        {'.', '6', '.', '.', '.', '.', '2', '8', '.'}, 
                        {'.', '.', '.', '4', '1', '9', '.', '.', '5'},
                        {'.', '.', '.', '.', '8', '.', '.', '7', '9'}
                };
        boolean result = hashlet.isValidSudoku(arr);
        System.out.println(result);


    }

    //行 和 列 和 九宫格的编号作为 哈希表的键,+
    // 存入的数字作为哈希表的值  根据哈希表的特性判断是不是有重复
    public boolean isValidSudoku(char[][] board) {
        HashMap<String, Boolean> map = new HashMap<>();
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                char num = board[i][j];
//                map.containsKey();
//                map.containsValue();存在值但是需要判断对应的键是不是保存了该值
                if (num == '.') continue;
                //设计标准:每行中值不同,每行出现的关键字是唯一的,值相同关键值也是相同的
                String rowKey = i + "row" + num;
                System.out.println("rowkeyiii " +rowKey);
                //设计标准:和行是相同的
                String colKey = j + "col" + num;
                System.out.println("colkeyiii " +colKey);

                //九宫格部分 设计每个位置的九宫格的唯一编号+不同的字符串标记+保存的数值
                int groupIndex = i / 3 + j / 3 * 3;
                String groupKey = groupIndex + "group" + num;
                //寻找是否有重复的数字 如果为null,使用默认值。不为null则是已经存入的值
                if (map.getOrDefault(rowKey, false)
                        || map.getOrDefault(colKey, false)
                        || map.getOrDefault(groupKey, false)) {
                    return false;
                }
                //更新遍历记录
                map.put(rowKey, true);
                map.put(colKey, true);
                map.put(groupKey, true);
            }
        }
        return true;
    }
}

看不明白别人怎么设计的就直接打印输出。

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Educational Edition 2019.3.1\lib\idea_rt.jar=50779:C:\Program Files\JetBrains\IntelliJ IDEA Educational Edition 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;C:\Users\li\IdeaProjects\com.myproject.li\out\production\com.myproject.li" com.company.leetCode36Hash
rowkeyiii 0row5
colkeyiii 0col5
rowkeyiii 0row3
colkeyiii 1col3
rowkeyiii 0row7
colkeyiii 4col7
rowkeyiii 1row6
colkeyiii 0col6
rowkeyiii 1row1
colkeyiii 3col1
rowkeyiii 1row9
colkeyiii 4col9
rowkeyiii 1row5
colkeyiii 5col5
rowkeyiii 2row9
colkeyiii 1col9
rowkeyiii 2row8
colkeyiii 2col8
rowkeyiii 2row6
colkeyiii 7col6
rowkeyiii 3row8
colkeyiii 0col8
rowkeyiii 3row6
colkeyiii 4col6
rowkeyiii 3row3
colkeyiii 8col3
rowkeyiii 4row4
colkeyiii 0col4
rowkeyiii 4row8
colkeyiii 3col8
rowkeyiii 4row3
colkeyiii 5col3
rowkeyiii 4row1
colkeyiii 8col1
rowkeyiii 5row7
colkeyiii 0col7
rowkeyiii 5row2
colkeyiii 4col2
rowkeyiii 5row6
colkeyiii 8col6
rowkeyiii 6row6
colkeyiii 1col6
rowkeyiii 6row2
colkeyiii 6col2
rowkeyiii 6row8
colkeyiii 7col8
rowkeyiii 7row4
colkeyiii 3col4
rowkeyiii 7row1
colkeyiii 4col1
rowkeyiii 7row9
colkeyiii 5col9
rowkeyiii 7row5
colkeyiii 8col5
rowkeyiii 8row8
colkeyiii 4col8
rowkeyiii 8row7
colkeyiii 7col7
rowkeyiii 8row9
colkeyiii 8col9
true

Process finished with exit code 0
发布了212 篇原创文章 · 获赞 32 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_42664961/article/details/104238554