难度困难603
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入:4 输出:[ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
提示:
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
判断j == col || i + j === row + col || i - j === row - col
妙啊
class Solution {
public:
vector<vector<string>> ans;
bool isValid(vector<string> s,int row,int col,int n){
for (int i = 0; i < row; i++) { // 之前的行
for (int j = 0; j < n; j++) { // 所有的列
if (s[i][j] == 'Q' && // 发现了皇后,并且和自己同列/对角线
(j == col || i + j == row + col || i - j == row - col)) {
return false; // 不是合法的选择
}}
}
return true;
}
void get(int index,int sum,vector<string> &s){
if(index==sum){
ans.push_back(s);return;
}
for(int i=0;i<sum;i++){
if(isValid(s,index,i,sum)){
s[index][i]='Q';
get(index+1,sum,s);
s[index][i]='.';
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<string> s(n, string(n, '.'));
get(0,n,s);
return ans;
}
};
51题和52题一样
难度简单2414
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxn=nums[0];
vector<int> dp(nums.size());
for(int i=0;i<nums.size();i++){
dp[i]=nums[i];
}
for(int i=1;i<nums.size();i++){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
if(dp[i]>maxn) maxn=dp[i];
}
return maxn;
}
};
难度中等489
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
int n=matrix.size();
int x=0;int y=0;
if(n==0) return ans;
int m=matrix.size();n=matrix[0].size();int cnt=m*n;
while(cnt){
for(int j=y;j<n;j++){
ans.push_back(matrix[x][j]);
cnt--;
}
if(cnt==0) break;
x++;
for(int i=x;i<m;i++){
ans.push_back(matrix[i][n-1]);
cnt--;
}
if(cnt==0) break;
n--;
for(int j=n-1;j>=y;j--){
ans.push_back(matrix[m-1][j]);
cnt--;
}
if(cnt==0) break;
m--;
for(int i=m-1;i>=x;i--){
ans.push_back(matrix[i][y]);
cnt--;
}
if(cnt==0) break;
y++;
}
return ans;
}
};
难度中等813
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
class Solution {
public:
//贪心!!!!!
//实时维护每次能跳到的最远位置
bool canJump(vector<int>& nums)
{
int k = 0;
for (int i = 0; i < nums.size(); i++)
{
if (i > k) return false;
k = max(k, i + nums[i]);
}
return true;
}
};
难度中等602
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: intervals = [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。
提示:
intervals[i][0] <= intervals[i][1]
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
vector<vector<int>> ans;
if(intervals.size()<=1) return intervals;
// 以下是一个一个合并,等到结尾or无法合并时push_back.
int x=intervals[0][0];
int y=intervals[0][1];
for(int i=1;i<intervals.size();i++){
int tx=intervals[i][0];
int ty=intervals[i][1];
if(tx>y){
ans.push_back({x,y});
if(i==intervals.size()-1) ans.push_back({tx,ty});
x=tx;y=ty;
}else{
x=min(x,tx);
y=max(y,ty);
if(i==intervals.size()-1) ans.push_back({x,y});
}
}
// for(int i=0;i<intervals.size();){//注意没有动作。
// //区间左端点确定为intervals[i][0],寻找右端点
// int t=intervals[i][1];
// int j=i+1;
// while(j<intervals.size()&&intervals[j][0]<=t){
// t=max(t,intervals[j][1]);j++;
// }
// ans.push_back({intervals[i][0],t});
// i=j;
// }
return ans;
}
};
难度简单240
给定一个仅包含大小写字母和空格 ' '
的字符串 s
,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
示例:
输入: "Hello World" 输出: 5
写的啥啊,脑袋疼....
class Solution {
public:
int lengthOfLastWord(string s) {
if(s.size()==1&&s[0]!=' ') return 1;
for(int i=s.size()-1;i>=0;i--){
if(s[i]!=' '){
int cnt=1;
while(i--){
if(i>=0&&s[i]==' ') break;
cnt++;
if(i==0) break;
}
return cnt;
}
}
return 0;
}
};
class Solution {
public:
int lengthOfLastWord(string s){
int len = s.size(), lastWordLen = 0;
if (len == 0) return 0;
for (int i = len - 1; i >= 0; i--) {
if (s[i] != ' ') lastWordLen++;
if (s[i] == ' ' && lastWordLen > 0) break;
}
return lastWordLen;
}
};
难度中等236
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n,vector<int>(n));
int x=0;int y=0;
if(n==0) return ans;
int m=n;
int cnt=m*n;int num=1;
while(cnt){
for(int j=y;j<n;j++){
ans[x][j]=num++;
cnt--;
}
if(cnt==0) break;
x++;
for(int i=x;i<m;i++){
ans[i][n-1]=num++;
cnt--;
}
if(cnt==0) break;
n--;
for(int j=n-1;j>=y;j--){
ans[m-1][j]=num++;
cnt--;
}
if(cnt==0) break;
m--;
for(int i=m-1;i>=x;i--){
ans[i][y]=num++;
cnt--;
}
if(cnt==0) break;
y++;
}
return ans;
}
};
难度中等381
给出集合 [1,2,3,…,n]
,其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
给定 n 和 k,返回第 k 个排列。
说明:
- 给定 n 的范围是 [1, 9]。
- 给定 k 的范围是[1, n!]。
示例 1:
输入: n = 3, k = 3 输出: "213"
示例 2:
输入: n = 4, k = 9 输出: "2314"
回溯,狗头,睡个午觉先...