给定一个非负整数
numRows
,生成「杨辉三角」的前numRows
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:
输入: numRows = 1 输出: [[1]]提示:
1 <= numRows <= 30
思路:后一个数组依赖前一个数组
class Solution {
public:
vector<int>format(vector<int>vec) {
vector<int>res;
res.reserve(vec.size()+1);
res.push_back(1);
for(int i=0; i<vec.size()-1; i++) {
res.push_back(vec[i]+vec[i+1]);
}
res.push_back(1);
return res;
}
vector<vector<int>> generate(int numRows) {
vector<int>vec(1, 1);
vector<vector<int>>res;
res.reserve(numRows);
res.push_back(vec);
for(int i=1; i<numRows; i++) {
int n = res.size();
auto param = res[n-1];
auto curr = format(param);
res.push_back(curr);
}
return res;
}
};
给定一个非负索引
rowIndex
,返回「杨辉三角」的第rowIndex
行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: rowIndex = 3 输出: [1,3,3,1]示例 2:
输入: rowIndex = 0 输出: [1]示例 3:
输入: rowIndex = 1 输出: [1,1]提示:
0 <= rowIndex <= 33
进阶:
你可以优化你的算法到
O(rowIndex)
空间复杂度吗?
思路,可以用上一题的做法做,但是有空间冗余,因为前后依赖关系,我们只需要前一个数组就行。利用向后往前推得策略,我们可以复用同一个。
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int>res(rowIndex+1, 1);
for(int i=rowIndex; i>=1; i--) {
for(int j=rowIndex-1; j>rowIndex-i; j--) {
res[j] = res[j] + res[j+1];
}
}
return res;
}
};
leetcode-598区间加法没什么好说的
给你一个大小为
m x n
的矩阵board
表示棋盘,其中,每个单元格可以是一艘战舰'X'
或者是一个空位'.'
,返回在棋盘board
上放置的 舰队 的数量。舰队 只能水平或者垂直放置在
board
上。换句话说,舰队只能按1 x k
(1
行,k
列)或k x 1
(k
行,1
列)的形状放置,其中k
可以是任意大小。两个舰队之间至少有一个水平或垂直的空格分隔 (即没有相邻的舰队)。示例 1:
输入:board = [["X",".",".","X"],[".",".",".","X"],[".",".",".","X"]] 输出:2示例 2:
输入:board = [["."]] 输出:0提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]
是'.'
或'X'
进阶:你可以实现一次扫描算法,并只使用
O(1)
额外空间,并且不修改board
的值来解决这个问题吗?
思路:某个格子是战舰的话,判断它的左边和右边是否为战舰,不是的话它就是一个战队
class Solution {
public:
bool check(vector<vector<char>>& board, int i, int j) {
if(board[i][j] != 'X') {
return false;
}
if((i-1<0 && j-1<0) || (i-1<0 && board[i][j-1] == '.' )|| (j-1<0 && board[i-1][j] == '.') || (i>0 && j>0 && board[i-1][j] == '.' && board[i][j-1] == '.')) {
return true;
}
return false;
}
int countBattleships(vector<vector<char>>& board) {
auto row = board.size();
auto col = board[0].size();
int res = 0;
for(int i=0; i<row; i++){
for(int j=0; j<col; j++) {
if(check(board, i, j)) {
++res;
}
}
}
return res;
}
};