LeetCode 49字母异位词分组50pow(x,n)51八皇后
原创公众号:
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八皇后相关推荐
- leetcode 49. 字母异位词分组
49. 字母异位词分组 - 力扣(LeetCode) 一开始想的是把各个字符串中每个字符ascii码值相加,然后相同的ascii码值放在一个组,在相同的ascii码值组中再去细找字母异位词. 一开始算 ...
- LeetCode 49. 字母异位词分组(哈希)
1. 题目 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例:输入: ["eat", "tea", "ta ...
- leetcode 49. 字母异位词分组(排序+hash)
给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...
- LeetCode 49. 字母异位词分组 Group Anagrams
给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...
- LeetCode 49 字母异位词分组
力扣 思路:哈希表: 排序:对两个字符串分别进行排序之后得到的字符串是相同的 将排序之后的字符串作为哈希表的键 (参考LeetCode官方题解) 定义哈希表 unordered_map< ...
- 【LeetCode】【HOT】49. 字母异位词分组(递归)
[LeetCode][HOT]49. 字母异位词分组 文章目录 [LeetCode][HOT]49. 字母异位词分组 package hot;import java.util.ArrayList; i ...
- Leetcode刷题100天—49. 字母异位词分组( 排序)—day37
前言: 作者:神的孩子在歌唱 大家好,我叫运智 49. 字母异位词分组 难度中等847收藏分享切换为英文接收动态反馈 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. ...
- 【LeetCode】49.字母异位词分组 (三种解法开拓思路,java实现)
49. 字母异位词分组 分析 方法一:排序数组分类 思路 当且仅当它们的排序字符串相等时,两个字符串是字母异位词. 算法 维护一个映射 ans : {String -> List},其中每个键 ...
- 49. 字母异位词分组
49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次. 示例 ...
最新文章
- 构建iOS稳定应用架构时方案选择的思考,主要涉及工程结构,数据流思想和代码规范...
- Android手机rom分区以及sd卡总结
- ##(两个井号)和#(一个井号)都是什么意思C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 .
- 最简单的一个java驱动jdbc链接mysql数据库
- windows 安装ipython
- 一步步构建大型网站架构 [转]
- Flask 中的Jinja2模板引擎
- python之路-08-集合
- 鼠标点计算机再点网络也是选定,鼠标左键单击变双击,点一下变两下是什么原因?...
- android screencap,android – “adb screencap /sdcard/screenshot.raw”生成什么格式? (没有“-p”标志)...
- healthkit简介
- Ti杯电子竞赛前期准备工作
- word删除空白页删不了怎么办?Word怎么删除空白页?
- 360安全浏览器支持国密功能
- vander范德蒙德行列式
- app logo显示不全没有铺满
- Three.js学习七——播放模型动画时模型沿着轨迹移动
- 一篇文章搞懂MongoDB数据库
- 爱因斯坦说过的名言,我的一些理解(一)
- 银河麒麟 ARM架构 Qemu虚拟机