N皇后
N皇后题目来源力扣-51N 皇后AcWing 843. n-皇后问题重点信息
皇后的个数、行数、列数总数相同,斜线总数为2n-1
所有皇后不能在同一行同一列同一斜线
要遍历出所有的可行摆放情况
笔者解析
可以设置三个一维boolean数组,分别用来封锁竖行,与两斜行。而横排则在传输中变换
使用DFS(深度优先搜索),回溯遍历
笔者代码力扣版本
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556class Solution { char[][] ch; List<List<String>> lists = new ArrayList<>(); //三个bool函数分别表示列,正斜线和反斜线(共有2n-1条斜线) boolean[] col = new boolean[11]; boolean[] d = new boolean[30]; b ...
力扣-599两个列表的最小索引总和
599. 两个列表的最小索引总和题目详情假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。
示例 1:
123输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]输出: ["Shogun"]解释: 他们唯一共同喜爱的餐厅是“Shogun”。
示例 2:
123输入:list1 = ["Shogun", "Tapioca Express&q ...
差分
差分相关题目输入一个长度为 nn 的整数序列。
接下来输入 mm 个操作,每个操作包含三个整数 l,r,cl,r,c,表示将序列中 [l,r][l,r] 之间的每个数加上 cc。
请你输出进行完所有操作后的序列。
输入格式第一行包含两个整数 nn 和 mm。
第二行包含 nn 个整数,表示整数序列。
接下来 mm 行,每行包含三个整数 l,r,cl,r,c,表示一个操作。
输出格式共一行,包含 nn 个整数,表示最终序列。
数据范围1≤n,m≤1000001≤n,m≤100000,1≤l≤r≤n1≤l≤r≤n,−1000≤c≤1000−1000≤c≤1000,−1000≤整数序列中元素的值≤1000−1000≤整数序列中元素的值≤1000
输入样例:123456 31 2 2 1 2 11 3 13 5 11 6 1
输出样例:13 4 5 3 4 2
算法思想
差分可以用于计算其中任意一段数组的加减,并且每次加减时间控制在O(1)
差分是前缀和的逆运算(前缀和是预先知道a[n],后计算S[n],以达到可以在O(1)时间段内,计算任意一段数据的和的目的)
前置条件:假设原来 ...
二维前缀和
AcWing 796. 子矩阵的和一. 题目详情输入一个 nn 行 mm 列的整数矩阵,再输入 qq 个询问,每个询问包含四个整数 x1,y1,x2,y2x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。
对于每个询问输出子矩阵中所有数的和。
输入格式第一行包含三个整数 n,m,qn,m,q。
接下来 nn 行,每行包含 mm 个整数,表示整数矩阵。
接下来 qq 行,每行包含四个整数 x1,y1,x2,y2x1,y1,x2,y2,表示一组询问。
输出格式共 qq 行,每行输出一个询问的结果。
数据范围1≤n,m≤10001≤n,m≤1000,1≤q≤2000001≤q≤200000,1≤x1≤x2≤n1≤x1≤x2≤n,1≤y1≤y2≤m1≤y1≤y2≤m,−1000≤矩阵内元素的值≤1000−1000≤矩阵内元素的值≤1000
输入样例:12345673 4 31 7 2 43 6 2 82 1 2 31 1 2 22 1 3 41 3 3 4
输出样例:123172721
二. 算法思想
计算s[i,j]
计算s[(x1,y1)(x2,y2)]
红 ...
一维前缀和
AcWing 795. 前缀和一. 题目详情输入一个长度为 nn 的整数序列。
接下来再输入 mm 个询问,每个询问输入一对 l,rl,r。
对于每个询问,输出原序列中从第 ll 个数到第 rr 个数的和。
输入格式第一行包含两个整数 nn 和 mm。
第二行包含 nn 个整数,表示整数数列。
接下来 mm 行,每行包含两个整数 ll 和 rr,表示一个询问的区间范围。
输出格式共 mm 行,每行输出一个询问的结果。
数据范围1≤l≤r≤n1≤l≤r≤n,1≤n,m≤1000001≤n,m≤100000,−1000≤数列中元素的值≤1000−1000≤数列中元素的值≤1000
输入样例:123455 32 1 3 6 41 21 32 4
输出样例:1233610
二. 算法思想
sn = a1+a2+a3……+an 前缀和基本思想
sn = an+s[n-1] 用于计算新的前缀和
s[l,r] = s[r] - s[l-1] 用于计算l~r的和
三. 笔者代码123456789101112131415161718192021222324 ...
ACwing4309-消灭老鼠
4309. 消灭老鼠一. 题目详情约翰的农场可以看作一个二维平面。
农场中有 n 个老鼠,在毁坏着农田。
第 i个老鼠的位置坐标为 (xi,yi)。
不同老鼠可能位于同一位置。
在 (x0,y0)处,装有一个双向发射的激光枪,该位置没有老鼠。
激光枪每次发射都可以将穿过点 (x0,y0) 的某一条直线上的所有老鼠都消灭掉。
请问,为了消灭所有老鼠,至少需要激光枪发射几次。
输入格式第一行包含三个整数 n,x0,y0表示共有 n 只老鼠,激光枪的位置为 (x0,y0)。
接下来 n 行,每行包含两个整数 xi,yi 表示第 ii 只老鼠的位置为 (xi,yi)。
输出格式一个整数,表示激光枪的最少发射次数。
数据范围前 55 个测试点满足 1≤n≤5。所有测试点满足 1≤n≤1000,−104≤xi,yi≤104。
输入样例1:123454 0 01 12 22 0-1 -1
输出样例1:12
输入样例2:1232 1 21 11 0
输出样例2:11
二. 问题梳理因为激光枪射线是双向发射的,所以此题为经典的直线扫描在四周问题,我们的目光主要集中在如下几个方面
怎样表达直 ...
特殊的正方型
特殊的正方形一. 题目描述输入nn,输出nn行nn列的由+和.组成的正方形,其中最外面一圈全是+,第二圈全是.,…,对于第ii圈,如果ii是奇数,那么全是+,否则全是.。
输入格式一行,一个整数n。
输出格式n行,为满足题目要求的正方形。注意不要有行末空格。
样例输入110
样例输出12345678910+++++++++++........++.++++++.++.+....+.++.+.++.+.++.+.++.+.++.+....+.++.++++++.++........+++++++++++
数据范围对于100%的数据,保证2≤n≤100。
二. 笔者见解由题目示例可见,该图形是一个中心对称图形,当要打印此类图形时我们可以使用对称思想
1.打印左上角的1/4图形
2.利用左右对称原理打印图形的右半部分(左右对称x轴改变y轴不改变)
3.利用上下对称原理打印图形的下半部分(上下对称y轴改变x轴不改变)
三. 作者代码123456789101112131415161718192021222324252627282930313233343536373839404142 ...
力扣189-轮转数组
189. 轮转数组一. 题目描述给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]示例 2:
输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]
提示:
1 <= nums.length <= 105-231 <= nums[i] <= 231 - 10 <= k <= 105
二. 笔者见解本题在力扣中属于中等难度,推荐使用二分法进行数据位置的翻转处理
1.翻转整个数组的顺序
2.翻转1~k个数据
3.翻转看k~n ...
ACwing3406-序列处理
4306. 序列处理一.题目给定一个长度为 n 的整数序列 a1,a2,…,an。
我们可以对该序列进行修改操作,每次操作选中其中一个元素,并使其增加 1。
现在,请你计算要使得序列中的元素各不相同,至少需要进行多少次操作。
输入格式第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
输出格式一个整数,表示所需的最少操作次数。
数据范围前 66 个测试点满足 1≤n≤10。所有测试点满足 1≤n≤3000,1≤ai≤n。
输入样例1:1241 3 1 4
输出样例1:11
输入样例2:1251 2 3 2 5
输出样例2:12
二.笔者见解本题属于acwing的中等难度题目,解题难点在于思路不好理清,当理清思路后会发现次题的破解难度不大。
在这里作者建议,灵活使用两个一维数组,一个数组用来存数值,用另一个数组的下标用来帮助数值变化。
三.解题12345678910111213141516171819202122232425262728import java.util.Arrays;import java.util.Scanner;public class ...
ACwing4210-数字
题目:ACwing
解题思路1.明确题意题目要求一个大于10进制整数A转换成2~A-1进制,并且把进制转化后的数字的各个位数相加,并将最后结果除以A-2
2.解题步骤1)把10进制数转换为其它进制数,采用比较朴素的辗转相除法,求出进制转换后的每一位数是多少。
代码
1234void base(int n, int i){ while (n) { sum += n % i, n /= i; }}
如把212转化为七进制
验证
2)因为结果输出要除A-2,所以我们采用欧几里得算法求解其最大公约数,让两者分别除自己的最大公约数后再输出
欧几里得算法的核心公式:gcd(a,b) = gcd(b,a mod b)。
12345int gcd(int a, int b){ if(a % b == 0) return b; return gcd(b, a % b);}
3)欧几里得例子:假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 ...





