力扣第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;
    }
};
目描述: 给出两个非空链表来表示两个非负整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以零开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解思路: 目中要求我们按照逆序的方式存储两个非负整数,也就是说链表的头节点表示该数的个位,第二个节点表示该数的十位,以此类推。 因此,我们可以从两个链表的头节点开始,对应位相加,并记录进位,将结果添加到新的链表中。如果有进位,需要在下一位相加时加上进位。 需要注意的是,当两个链表的长度不一致时,可以将较短的链表的缺失位看作是 0。 最后,如果最高位有进位,还需要在新链表的最高位添加一个值为 1 的节点。 C 语言代码实现: /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ struct ListNode *head = NULL, *tail = NULL; int carry = 0; while (l1 || l2) { int n1 = l1 ? l1->val : 0; int n2 = l2 ? l2->val : 0; int sum = n1 + n2 + carry; if (!head) { head = tail = malloc(sizeof(struct ListNode)); tail->val = sum % 10; tail->next = NULL; } else { tail->next = malloc(sizeof(struct ListNode)); tail = tail->next; tail->val = sum % 10; tail->next = NULL; } carry = sum / 10; if (l1) l1 = l1->next; if (l2) l2 = l2->next; } if (carry > 0) { tail->next = malloc(sizeof(struct ListNode)); tail = tail->next; tail->val = carry; tail->next = NULL; } return head; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值