vector<int>maxArray(vector<int>&nums,intk){int n =nums.size(); vector<int>res(k);for(int i =0, j =0; i <nums.size(); i++){int x =nums[i];// 这里的逻辑是 如果栈里有元素 且栈顶元素比x小,且弹出后还能凑成k个数的话(能删) 就删while(j &&res[j -1]< x && j + n - i > k) j--;if(j < k)res[j++]= x;// 如果可以加入就加入 这里学习一下}}
class Solution {
public:
int n, m;
vector<vector<int>> f;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
public:
int dp(vector<vector<int>>& matrix, int x, int y)
{
if(f[x][y] != -1) return f[x][y];
f[x][y] = 1;
for(int i = 0; i < 4; i++)
{
int nx = x + dx[i], ny = y + dy[i];
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if(matrix[nx][ny] <= matrix[x][y]) continue; // 注意这里限制的是严格递增
f[x][y] = max(f[x][y], dp(matrix, nx, ny) + 1);
}
return f[x][y];
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
// 记忆化搜索
n = matrix.size(), m = matrix[0].size();
f = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));
int res = 1;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
res = max(res, dp(matrix, i, j));
return res;
}
};
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
int res = 0, i = 0;
long long x = 1; // 数可能很大 所以这里是long long
while(x <= n)
{
if(i < nums.size() && nums[i] <= x) x += nums[i++];
else x += x, res ++;
}
return res;
}
};