题目一:2016. 增量元素之间的最大差值
题目描述:
【模拟】首先分析一下数据范围,1000的数据可以n^2处理,最简单的一种方法是2个for去解决,保证第二个大于第一个,取个max即可.
示例:
for(int i = 1;i <= n;i ++)
for(int j = i + 1;j <= n;j ++)
if(num[j] > num[i])
ans = max(ans,num[j] - num[i]);
【模拟】我们发现位置上第二个恒大于第一个,每次都从头找一遍显然效率不高,因此我们只需要记录一下前面的最小值比较能否更新即可。
AC代码
class Solution {
public:
int maximumDifference(vector<int>& nums) {
int n = nums.size();
int ans = -1,minn = nums[0];
for(int i = 1;i < n;i ++)
{
ans = max(ans,nums[i] - minn);
minn = min(minn,nums[i]);
}
if(!ans) return -1;
return ans;
}
};
题目二:2017. 网格游戏
观察数据范围我们可以采用nlogn以下复杂度的算法
由于机器人只能向下或者向右我们可以很容易的观察到第二个机器人只会出现3种情况
情况一:图示蓝色区域
情况二:图示蓝色区域
情况三:图示蓝色和紫色区域中较大的一个
【前缀和】其中情况一和情况二均可抽象成紫色区域为0的情况三
因此答案只有可能是max(第一行的后缀和,第二行的前缀和),由于红色会尽可能打压我方,所以在所有的列中取个min
AC代码
class Solution {
public:
long long sum1[100005],sum2[100005];
long long gridGame(vector<vector<int>>& grid) {
long long n = grid[0].size(),ans = 214748364000;
for(int i = 0;i < n;i ++)
sum1[i + 1] = grid[1][i] + sum1[i];
for(int i = n - 1;i >= 0;i --)
sum2[i + 1] = grid[0][i] + sum2[i + 2];
for(int i = 1;i <= n;i ++)
ans = min(ans,max(sum1[i - 1],sum2[i + 1]));
return ans;
}
};
第三题:2018. 判断单词是否能放入填字游戏内
【模拟】巨恶心的模拟题
填数字的方法有从下往上,从左往右,从右往左,从上往下四种
需要保证填完数字之后上下不是字母且不是空格
比赛结束前23秒做完,交错了3次
怀疑因为被太多人吐槽修改了题意,原来通不过的代码可以通过了,原题目需要至少填一个字母(即查找过程中,查到的字符串之间至少有一个空格),经过试错(比赛过程数据未封闭),加了个变量特判过了,修改后不需要额外添加特判
原AC代码
class Solution {
public:
bool placeWordInCrossword(vector<vector<char>>& ma, string s) {
int len = s.size();
int n = ma.size();
int m = ma[0].size();
//上下左右
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(i != n - 1&&ma[i + 1][j] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
bool flag = 0;
for(int k = 0;k < len;k ++)
{
if(i - k < 0||(ma[i - k][j] != s[k]&&ma[i - k][j] != ' ')) break;
if(ma[i - k][j] == ' ') flag = 1;
if(k == len - 1&&(i - k == 0||ma[i - k - 1][j] == '#')&&flag)
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(i != 0&&ma[i - 1][j] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
bool flag = 0;
for(int k = 0;k < len;k ++)
{
if(i + k >= n||(ma[i + k][j] != s[k]&&ma[i + k][j] != ' ')) break;
if(ma[i + k][j] == ' ') flag = 0;
if(k == len - 1&&(i + k == n - 1||ma[i + k + 1][j] == '#')&&flag)
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(j != m - 1&&ma[i][j + 1] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
bool flag = 0;
for(int k = 0;k < len;k ++)
{
if(j - k < 0||(ma[i][j - k] != s[k]&&ma[i][j - k] != ' ')) break;
if(ma[i][j - k] == ' ') flag = 1;
if(k == len - 1&&(j - k == 0||ma[i][j - k - 1] == '#')&&flag)
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(j != 0&&ma[i][j - 1] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
bool flag = 0;
for(int k = 0;k < len;k ++)
{
if(j + k >= m||(ma[i][j + k] != s[k]&&ma[i][j + k] != ' ')) break;
if(ma[i][j + k] == ' ') flag = 1;
if(k == len - 1&&(j + k == m - 1||ma[i][j + k + 1] == '#')&&flag)
{
return true;
}
}
}
return false;
}
};
修改题意后AC代码
class Solution {
public:
bool placeWordInCrossword(vector<vector<char>>& ma, string s) {
int len = s.size();
int n = ma.size();
int m = ma[0].size();
//上下左右
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(i != n - 1&&ma[i + 1][j] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
for(int k = 0;k < len;k ++)
{
if(i - k < 0||(ma[i - k][j] != s[k]&&ma[i - k][j] != ' ')) break;
if(k == len - 1&&(i - k == 0||ma[i - k - 1][j] == '#'))
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(i != 0&&ma[i - 1][j] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
for(int k = 0;k < len;k ++)
{
if(i + k >= n||(ma[i + k][j] != s[k]&&ma[i + k][j] != ' ')) break;
if(k == len - 1&&(i + k == n - 1||ma[i + k + 1][j] == '#'))
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(j != m - 1&&ma[i][j + 1] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
for(int k = 0;k < len;k ++)
{
if(j - k < 0||(ma[i][j - k] != s[k]&&ma[i][j - k] != ' ')) break;
if(k == len - 1&&(j - k == 0||ma[i][j - k - 1] == '#'))
{
return true;
}
}
}
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(j != 0&&ma[i][j - 1] != '#') continue;
if(ma[i][j] != ' '&&ma[i][j] != s[0]) continue;
for(int k = 0;k < len;k ++)
{
if(j + k >= m||(ma[i][j + k] != s[k]&&ma[i][j + k] != ' ')) break;
if(k == len - 1&&(j + k == m - 1||ma[i][j + k + 1] == '#'))
{
return true;
}
}
}
return false;
}
};