力扣第260场周赛题解

题目一: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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值