java 八皇后 剑指offer_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中。我们的核心问题是将这个放到哪里?

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

3ff665920331a2083bf38c3db61f280b.png

实现代码为:

public List> groupAnagrams(String[] strs) {

List>lists=new ArrayList<>();

Map>map=new HashMap<>();

for(String str: strs)

{

char vachar[]=str.toCharArray();

Arrays.sort(vachar);

String team=String.copyValueOf(vachar);

Listlist=map.getOrDefault(team,new ArrayList<>());

list.add(str);

map.put(team,list);

}

// for(List list:map.values())

// {

// lists.add(list);

// }

lists.addAll(map.values());

return lists;

}

执行结果:

04e52b81df34c29dec2784ee33431c97.png

Pow(x,n)

67dbc7a346d33ca106be20134efd2876.png

很明显的快速幂算法,强烈推荐自己写的快速幂介绍:

负数处理,并且负数可能是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);

else

return x*myPow(x*x,n/2);

}

1b555cef752abcbbd9bb018e8374faf8.png

N皇后

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

a14ed9779d7545c6a42c2c34e85b504c.png

上图为 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> solveNQueens(int n) {

List> list=new ArrayList>();

StringBuilder stringBuilder[]=new StringBuilder[n];

for(int i=0;i

{

stringBuilder[i]=new StringBuilder();

for(int j=0;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,int n) {

// TODO Auto-generated method stub

if(index==n)//存入

{

Listval=new ArrayList();

//StringBuilder sBuilder=new StringBuilder();

for(int i=0;i

{

val.add(sBuilder[i].toString());

}

list.add(val);

}

else {

for(int j=0;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%:

18df9712c5227e03bf4f58c54a63dff5.png

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

d3e1a5599bf09080bdfbb6231ba30cfb.png

本文分享 CSDN - Big sai。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值