1.N皇后
这个问题其实不难解决
列一个数组来存放每一行的皇后放在哪儿
方法就是每一行去放置 每次只判断当前放置的是否与之前的冲突就行了
for一个循环来决定它放在当前行的哪一个
然后内部for循环判断是否与前面的某一行冲突
接下来就是 如果冲突就把它break 进行下一个放置 如果不冲突就考虑下一行的放置
直到达到要求的行数 就说明这种放置时允许的 计算作一种放法
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
int tot=0;
searsh(0);
}
void searsh(int cur){
if(cur==n-1){tot++;}
int ok=1;
vector<int>C(n-1);
else{
for(int i=0;i<n;i++){
C[cur]=i;
for(int j=0;j<cur;j++){
if( C[cur]==C[j]|| cur-i==j-C[j] || cur+i==j+C[j]){
ok=0;
break;
}
if(ok){search(cur+1); }
}
}
}
}
};
这个时我写的 有问题 因为要求列出来摆放方式
2.N皇后II
3.最大子序和
这道题如果按我的方法来遍历 就会超出时间限制
所以这道题的 思路在于
既然是在计算最大的部分和 那么一旦部分和小于0 与其有之 不如无之
所以一旦部分和小于0 就令为0 重新开始计数
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res=INT_MIN;
int tempmin=0;
for(auto v:nums){
tempmin+=v;
if(tempmin>=res){res=tempmin;}
if(tempmin<0){tempmin=0;}
}
return res;
}
};
4.螺旋矩阵
这道题还有一些细节待解决
主要思想是左右 上下 右左 下上
在while循环中套入4个for循环即可
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.size()==0) return res;
int up=0,down=matrix.size()-1,left=0,right=matrix[0].size()-1;
while(up<=down && left<=right){
for(int i=left;i<=right;i++) res.push_back(matrix[up][i]);
for (int i=up+1;i<=down;i++) res.push_back(matrix[i][right]);
if(up<down && left<right){
for(int i=right-1;i>left;i--) res.push_back(matrix[down][i]);
for(int i=down;i>up;i--) res.push_back(matrix[i][left]);
}
up++;
down--;
left++;
right--;
}
return res;
}
};