leetcode第52题

简介: 可以发现对于同一条副对角线,row + col 的值是相等的。对于同一条主对角线,row - col 的值是相等的。我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。

image.png

上一题一样,只不过这次不需要返回所有结果,只需要返回有多少个解就可以。

解法一

我们直接把上道题的 ans 的 size 返回就可以了,此外 currentQueen.size ( ) == n 的时候,也不用去生成一个解了,直接加一个数字占位。

publicinttotalNQueens(intn) {
List<Integer>ans=newArrayList<>();
backtrack(newArrayList<Integer>(), ans, n);
returnans.size();
}
privatevoidbacktrack(List<Integer>currentQueen, List<Integer>ans, intn) {
if (currentQueen.size() ==n) {
ans.add(1);
return;
    }
for (intcol=0; col<n; col++) {
if (!currentQueen.contains(col)) {
if (isDiagonalAttack(currentQueen, col)) {
continue;
            }
currentQueen.add(col);
backtrack(currentQueen, ans, n);
currentQueen.remove(currentQueen.size() -1);
        }
    }
}
privatebooleanisDiagonalAttack(List<Integer>currentQueen, inti) {
intcurrent_row=currentQueen.size();
intcurrent_col=i;
for (introw=0; row<currentQueen.size(); row++) {
if (Math.abs(current_row-row) ==Math.abs(current_col-currentQueen.get(row))) {
returntrue;
        }
    }
returnfalse;
}

时间复杂度:

空间复杂度:

解法二

参考这里)。

既然不用返回所有解,那么我们就不需要 currentQueen 来保存当前已加入皇后的位置。只需要一个 bool 型数组,来标记列是否被占有就可以了。

由于没有了 currentQueen,所有不能再用之前 isDiagonalAttack 判断对角线冲突的方法了。我们可以观察下,对角线元素的情况。

image.png

可以发现对于同一条副对角线,row + col 的值是相等的。

对于同一条主对角线,row - col 的值是相等的。

我们同样可以用一个 bool 型数组,来保存当前对角线是否有元素,把它们相加相减的值作为下标。

对于 row - col ,由于出现了负数,所以可以加 1 个 n,由 [ - 3, 3 ] 转换为 [ 1 , 7 ] 。

publicinttotalNQueens(intn) {
List<Integer>ans=newArrayList<>();
boolean[] cols=newboolean[n]; // 列boolean[] d1=newboolean[2*n]; // 主对角线 boolean[] d2=newboolean[2*n]; // 副对角线returnbacktrack(0, cols, d1, d2, n, 0);
}
privateintbacktrack(introw, boolean[] cols, boolean[] d1, boolean[] d2, intn, intcount) { 
if (row==n) {
count++;
    } else {
for (intcol=0; col<n; col++) {
intid1=row-col+n; //主对角线加 nintid2=row+col;
if (cols[col] ||d1[id1] ||d2[id2])
continue;
cols[col] =true;
d1[id1] =true;
d2[id2] =true;
count=backtrack(row+1, cols, d1, d2, n, count);
cols[col] =false;
d1[id1] =false;
d2[id2] =false;
        }
    }
returncount;
}

时间复杂度:

空间复杂度:

和上一题相比,通过三个 bool 型数组来标记是否占有,不存储具体的位置,从而解决了这道题。


相关文章
|
存储 缓存 NoSQL
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
279 1
Redis 布隆过滤器实战「缓存击穿、雪崩效应」
|
SQL 运维 监控
云平台-多租户技术设计
云平台-多租户技术设计
云平台-多租户技术设计
|
搜索推荐 前端开发 开发者
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。
471 11
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
|
人工智能 Cloud Native 数据库
《阿里云产品四月刊》—一文解读:阿里云 AI 基础设施的演进与挑战(3)
阿里云瑶池数据库云原生化和一体化产品能力升级,多款产品更新迭代
407 1
《阿里云产品四月刊》—一文解读:阿里云 AI 基础设施的演进与挑战(3)
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
918 1
|
监控 Cloud Native 大数据
即刻预约|阿里云数据库 SelectDB 版商业化发布会,5月21日14:00与您相约
2024年5月2日14:00,阿里云数据库 SelectDB 版商业化产品发布会将于线上重磅举行,即刻开启预约!👇 直播地址:https://developer.aliyun.com/special/selectdb?utm_content=g_1000393528
1011 0
即刻预约|阿里云数据库 SelectDB 版商业化发布会,5月21日14:00与您相约
|
人工智能 自然语言处理 安全
搭建微信公众号AI助手
将微信公众号(订阅号)变为AI智能客服仅需四步:创建大模型问答应用、搭建微信公众号连接流、引入AI智能客服及增加私有知识。首先在百炼平台创建应用并获取API密钥;其次利用阿里云AppFlow服务无代码连接微信公众号与大模型应用;接着配置公众号引入AI客服;最后上传企业知识文档提升客服精准度。通过这些步骤,轻松实现智能化客户服务。
1494 2
|
人工智能 关系型数据库 OLAP
通义大模型百炼融合AnalyticDB, 阿里云专家手把手带你10分钟创建网站AI助手
本次陪跑班将从一个企业开发者的角度出发,手把手带你用AnalyticDB for PostgreSQL的高效向量引擎与阿里云自主研发的通义大模型服务平台百炼,只需10分钟即可为您的网站添加一个AI助手。加入钉群观看直播课程,更有精彩好礼等你拿!
|
弹性计算 缓存 网络安全
云服务器 ECS产品使用问题之远程桌面无法连接到Windows实例,该如何排查
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
Linux 网络安全 开发工具
CentOS7增加或修改SSH端口号
CentOS7增加或修改SSH端口号
383 0