原创公众号:bigsai 如果不错记得点赞收藏!
关注回复 bigsai 领取Java进阶pdf资源,回复进群加入力扣打卡群。
上周打卡内容:43字符串相乘&44通配符匹配 45跳跃游戏&46全排列
昨天打卡内容:LeetCode 47全排列Ⅱ&48旋转图像

字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[["ate","eat","tea"],["nat","tan"],["bat"]
]

说明:

所有输入均为小写字母。
不考虑答案输出的顺序。

分析

题目的意思就是给若干个字符串单词,然后将含有全部相同的字母放到一个List<String>中。我们的核心问题是将这个放到哪里?

你可以使用暴力枚举,每次遍历判断,但是那样效率太低,所以我们可以进行哈希 存储。创建一个Map<String,List<String>>类型的HashMap进行存储。

实现代码为:

public List<List<String>> groupAnagrams(String[] strs) {List<List<String>>lists=new ArrayList<>();Map<String,List<String>>map=new HashMap<>();for(String str: strs){char vachar[]=str.toCharArray();Arrays.sort(vachar);String team=String.copyValueOf(vachar);List<String>list=map.getOrDefault(team,new ArrayList<>());list.add(str);map.put(team,list);}
//        for(List<String> list:map.values())
//        {//            lists.add(list);
//        }lists.addAll(map.values());return  lists;}

执行结果:

Pow(x,n)


很明显的快速幂算法,强烈推荐自己写的快速幂介绍:数据结构与算法—这可能是最易懂的快速幂讲解了
但是你需要注意一些地方:

  • 负数处理,并且负数可能是int最小值加个符号转换数值越界出错。所以负数转正数的时候,将负数次幂拆分一个出来就可以转正数幂进行计算了。例如5-2147483648=5-1 x 5 -2147483647 =(1/5 ) x(1/5)2147483647 。int 范围为[-2147483648,2147483647].
  • 注意好停止条件,这里理论上可以稍微重写个函数优化一下,但是由于快速幂logn级别的复杂度比较低,这里就不进行优化直接写了:
 public double myPow(double x, int n) {if(n<0)return  (1.0/x)*myPow(1.0/x,-(n+1));if(n==0)return 1;else if(n%2==0)return myPow(x*x,n/2);elsereturn x*myPow(x*x,n/2);}

N皇后

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例:

输入:4
输出:[[".Q..",  // 解法 1"...Q","Q...","..Q."],["..Q.",  // 解法 2"Q...","...Q",".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

提示:
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

八皇后问题我再这篇:回溯算法 | 追忆那些年曾难倒我们的八皇后问题 讲的已经很清楚了,不懂的可以详细看看。

在具体的实现上,就是需要一个map[][]的地图记录各个位置的符号,然后按照规则存储进去,但我这里用了个StringBuilder[]数组来完成。
另外,判断方向的时候因为从一行一行来,如果判断横方向就是多此一举。
附上代码:

// boolean heng[];boolean shu[];boolean zuoxie[];boolean youxie[];public List<List<String>> solveNQueens(int n) {List<List<String>> list=new ArrayList<List<String>>();StringBuilder stringBuilder[]=new StringBuilder[n];for(int i=0;i<n;i++){stringBuilder[i]=new StringBuilder();for(int j=0;j<n;j++){stringBuilder[i].append('.');}}shu=new boolean[n];zuoxie=new boolean[n*2];youxie=new boolean[n*2];dfs(0,stringBuilder,list,n);return list;}private void dfs(int index, StringBuilder sBuilder[], List<List<String>> list,int n) {// TODO Auto-generated method stubif(index==n)//存入{List<String>val=new ArrayList<String>();//StringBuilder sBuilder=new StringBuilder();for(int i=0;i<n;i++){val.add(sBuilder[i].toString());}list.add(val);}else {for(int j=0;j<n;j++){if(!shu[j]&&!zuoxie[index+j]&&!youxie[index+(n-1-j)]){shu[j]=true;zuoxie[index+j]=true;youxie[index+(n-1-j)]=true;//map[index][j]='Q';sBuilder[index].setCharAt(j, 'Q');dfs(index+1,sBuilder, list, n);shu[j]=false;zuoxie[index+j]=false;youxie[index+(n-1-j)]=false;sBuilder[index].setCharAt(j, '.');//map[index][j]='.';}}}
}

总是熟悉的100%:

结语:好了今天就到这里了,欢迎关注原创技术公众号:【bigsai】,回复进群加笔者微信一起加入打卡!回复「bigsai」,领取进阶资源。

LeetCode 49字母异位词分组50pow(x,n)51八皇后相关推荐

  1. leetcode 49. 字母异位词分组

    49. 字母异位词分组 - 力扣(LeetCode) 一开始想的是把各个字符串中每个字符ascii码值相加,然后相同的ascii码值放在一个组,在相同的ascii码值组中再去细找字母异位词. 一开始算 ...

  2. LeetCode 49. 字母异位词分组(哈希)

    1. 题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例:输入: ["eat", "tea", "ta ...

  3. leetcode 49. 字母异位词分组(排序+hash)

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  4. LeetCode 49. 字母异位词分组 Group Anagrams

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  5. LeetCode 49 字母异位词分组

    力扣 思路:哈希表: 排序:对两个字符串分别进行排序之后得到的字符串是相同的 将排序之后的字符串作为哈希表的键     (参考LeetCode官方题解)  定义哈希表 unordered_map< ...

  6. 【LeetCode】【HOT】49. 字母异位词分组(递归)

    [LeetCode][HOT]49. 字母异位词分组 文章目录 [LeetCode][HOT]49. 字母异位词分组 package hot;import java.util.ArrayList; i ...

  7. Leetcode刷题100天—49. 字母异位词分组( 排序)—day37

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 49. 字母异位词分组 难度中等847收藏分享切换为英文接收动态反馈 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. ...

  8. 【LeetCode】49.字母异位词分组 (三种解法开拓思路,java实现)

    49. 字母异位词分组 分析 方法一:排序数组分类 思路 当且仅当它们的排序字符串相等时,两个字符串是字母异位词. 算法 维护一个映射 ans : {String -> List},其中每个键 ...

  9. 49. 字母异位词分组

    49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次. 示例 ...

最新文章

  1. 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范...
  2. Android手机rom分区以及sd卡总结
  3. ##(两个井号)和#(一个井号)都是什么意思C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 .
  4. 最简单的一个java驱动jdbc链接mysql数据库
  5. windows 安装ipython
  6. 一步步构建大型网站架构 [转]
  7. Flask 中的Jinja2模板引擎
  8. python之路-08-集合
  9. 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
  10. android screencap,android – “adb screencap /sdcard/screenshot.raw”生成什么格式? (没有“-p”标志)...
  11. healthkit简介
  12. Ti杯电子竞赛前期准备工作
  13. word删除空白页删不了怎么办?Word怎么删除空白页?
  14. 360安全浏览器支持国密功能
  15. vander范德蒙德行列式
  16. app logo显示不全没有铺满
  17. Three.js学习七——播放模型动画时模型沿着轨迹移动
  18. 一篇文章搞懂MongoDB数据库
  19. 爱因斯坦说过的名言,我的一些理解(一)
  20. 银河麒麟 ARM架构 Qemu虚拟机

热门文章

  1. 数学建模——支持向量机模型详解Python代码
  2. web自动化测试常见面试题
  3. 基于Warshall算法的连通图及欧拉图判定方法
  4. php 数据显示格式,php数据格式
  5. 内核驱动漏洞与攻击预防--by MJ0011
  6. const 和指针赋值
  7. c/c++ typedef定义函数指针(Hook前奏2)
  8. 2020-11-23(dll注入方法)
  9. 【网络安全】 利用 EHole 进行红队快速批量打点
  10. 012 动态调试smali代码