示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
提示:
皇后,是国际象棋中的棋子,意味着国王的妻子。皇后只做一件事,那就是“吃子”。当她遇见可以吃的棋子时,就迅速冲上去吃掉棋子。当然,她横、竖、斜都可走一到七步,可进可退。(引用自 百度百科 - 皇后 )
class Solution {
vector<vector<string>> res;
vector<string>path;
public:
vector<vector<string>> solveNQueens(int n) {
if(n<=0)return {};
path.resize(n,string(n,'.'));
backTrack(0,n);
return res;
}
void backTrack(int i,int n){
if(n==i){
res.push_back(path);
return;
}
for(int j=0;j<n;++j)
if(match(path,i,j)){
path[i][j]='Q';
backTrack(i+1,n);
path[i][j]='.';
}
}
bool match(vector<string>&path,int m,int n){
for(int i=0;i<path.size();++i)
if(i==n)continue;
else if(path[m][i]=='Q')return false;
for(int i=0;i<path.size();++i)
if(i==m)continue;
else if(path[i][n]=='Q')return false;
for(int i=m+1,j=n+1;i<path.size()&&j<path.size();++i,++j)
if(path[i][j]=='Q')return false;
for(int i=m-1,j=n-1;i>=0&&j>=0;--i,--j)
if(path[i][j]=='Q')return false;
for(int i=m+1,j=n-1;i<path.size()&&j>=0;++i,--j)
if(path[i][j]=='Q')return false;
for(int i=m-1,j=n+1;i>=0&&j<path.size();--i,++j)
if(path[i][j]=='Q')return false;
return true;
}
};
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
class Solution {//归并排序
public:
int reversePairs(vector<int>& nums) {
if(nums.size()<=1)return 0;
vector<int>dst(nums.size());
return mergeSort(nums,dst,0,nums.size()-1);
}
int mergeSort(vector<int>&nums,vector<int>&dst,int low,int high){
if(low>=high)return 0;
int l1=low,l2=(low+high)>>1;
int r1=l2+1,r2=high;
int res=mergeSort(nums,dst,l1,l2)+mergeSort(nums,dst,r1,r2);
int i=low;
while(l1<=l2&&r1<=r2)
if(nums[l1]<=nums[r1]){//
dst[i++]=nums[l1++];
res+=(r1-l2-1);//
}
else
dst[i++]=nums[r1++];
while(l1<=l2){
dst[i++]=nums[l1++];
res+=(r1-l2-1);//
}
while(r1<=r2)
dst[i++]=nums[r1++];
for(int j=low;j<=high;++j)
nums[j]=dst[j];
return res;
}
};