LeetCode 第 186 场周赛(1060/3107,前34.1%)

文章目录

    • 1. 比赛结果
    • 2. 题目
      • 1. LeetCode 5392. 分割字符串的最大得分 easy
      • 2. LeetCode 5393. 可获得的最大点数 medium
      • 3. LeetCode 5394. 对角线遍历 II medium
      • 4. LeetCode 5180. 带限制的子序列和 hard

1. 比赛结果

做出来了 1、2 题,第3题模拟法,超时,第4题不会,继续加油!

全国排名:1060 / 3107,34.1%;全球排名:4145 / 11687,35.5%
在这里插入图片描述
在这里插入图片描述

2. 题目

1. LeetCode 5392. 分割字符串的最大得分 easy

题目链接

给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分

「分割字符串的得分」为 子字符串中 0 的数量加上 子字符串中 1 的数量。

示例 1:
输入:s = "011101"
输出:5 
解释:
将字符串 s 划分为两个非空子字符串的可行方案有:
左子字符串 = "0" 且 右子字符串 = "11101",得分 = 1 + 4 = 5 
左子字符串 = "01" 且 右子字符串 = "1101",得分 = 1 + 3 = 4 
左子字符串 = "011" 且 右子字符串 = "101",得分 = 1 + 2 = 3 
左子字符串 = "0111" 且 右子字符串 = "01",得分 = 1 + 1 = 2 
左子字符串 = "01110" 且 右子字符串 = "1",得分 = 2 + 1 = 3示例 2:
输入:s = "00111"
输出:5
解释:当 左子字符串 = "00" 且 右子字符串 = "111" 时,
我们得到最大得分 = 2 + 3 = 5示例 3:
输入:s = "1111"
输出:3提示:
2 <= s.length <= 500
字符串 s 仅由字符 '0''1' 组成。

解答:

  • 左右两边,前缀0,后缀1,一次遍历即可
    在这里插入图片描述
    比赛的时候写的有点繁琐
class Solution {
public:int maxScore(string s) {vector<int> left0(2*s.size()-1,0);vector<int> right1(2*s.size()-1,0);int i, n = s.size();left0[0] = s[0]=='0' ? 1 : 0;for(i = 1; i < n; ++i)left0[2*i] = s[i]=='0'? left0[2*i-2]+1 : left0[2*i-2];right1[2*n-2] = s[n-1]=='1' ? 1 : 0;for(i = n-2; i >= 0; --i)right1[2*i] = s[i]=='1'? right1[2*i+2]+1 : right1[2*i+2];int maxsc = 0;for(i = 1; i < 2*n-2; i+=2)maxsc = max(maxsc, left0[i-1]+right1[i+1]);return maxsc;}
};

4 ms 6.9 MB

赛后解

class Solution {
public:int maxScore(string s) {int i, one = 0, maxs = 0, zero = 0;for(i = 0; i < s.size(); ++i){if(s[i]=='1')one++;}for(i = 0; i < s.size()-1; ++i){if(s[i]=='0')zero++;elseone--;maxs = max(maxs,zero+one);}return maxs;}
};

0 ms 6.4 MB

2. LeetCode 5393. 可获得的最大点数 medium

题目链接
几张卡牌 排成一行,每张卡牌都有一个对应的点数。
点数由整数数组 cardPoints 给出。

每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。

你的点数就是你拿到手中的所有卡牌的点数之和。

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

示例 1:
输入:cardPoints = [1,2,3,4,5,6,1], k = 3
输出:12
解释:第一次行动,不管拿哪张牌,你的点数总是 1 。
但是,先拿最右边的卡牌将会最大化你的可获得点数。
最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。示例 2:
输入:cardPoints = [2,2,2], k = 2
输出:4
解释:无论你拿起哪两张卡牌,可获得的点数总是 4 。示例 3:
输入:cardPoints = [9,7,7,9,7,7,9], k = 7
输出:55
解释:你必须拿起所有卡牌,可以获得的点数为所有卡牌的点数之和。示例 4:
输入:cardPoints = [1,1000,1], k = 1
输出:1
解释:你无法拿到中间那张卡牌,所以可以获得的最大点数为 1 。 示例 5:
输入:cardPoints = [1,79,80,1,1,1,200,1], k = 3
输出:202提示:
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length

解答:

比赛的时候差点被坑,以为是DP,一想左右各取a,b个,a+b = k 不就完了吗
(也可以反过来想,求中间子序和最小,滑动窗口)

class Solution {
public:int maxScore(vector<int>& cardPoints, int k) {vector<int> l(k+2,0);vector<int> r(k+2,0);int len = 1, i;for(i = 0; i < k; ++i,++len)l[len] = cardPoints[i]+l[len-1];len = 1;for(i = cardPoints.size()-1; len <= k; --i,++len)r[len] = cardPoints[i]+r[len-1];int maxScore = 0;for(len = 0; len <= k; ++len)maxScore = max(maxScore, l[len]+r[k-len]);return maxScore;}
};

148 ms 44.2 MB

3. LeetCode 5394. 对角线遍历 II medium

题目链接
给你一个列表 nums ,里面每一个元素都是一个整数列表。
请你依照下面各图的规则,按顺序返回 nums 中对角线上的整数。

示例 1:
在这里插入图片描述

输入:nums = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,4,2,7,5,3,8,6,9]

示例 2:
在这里插入图片描述

输入:nums = [[1,2,3,4,5],[6,7],[8],[9,10,11],[12,13,14,15,16]]
输出:[1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]示例 3:
输入:nums = [[1,2,3],[4],[5,6,7],[8],[9,10,11]]
输出:[1,4,2,5,3,8,6,9,7,10,11]示例 4:
输入:nums = [[1,2,3,4,5,6]]
输出:[1,2,3,4,5,6]提示:
1 <= nums.length <= 10^5
1 <= nums[i].length <= 10^5
1 <= nums[i][j] <= 10^9
nums 中最多有 10^5 个数字。

比赛模拟写法超时:
在这里插入图片描述

class Solution {
public:vector<int> findDiagonalOrder(vector<vector<int>>& nums) {vector<int> ans;int i = 0, j = 0, count = 0, c = 0, x, y, m = nums.size(),n=0, finishi = -1;vector<int> precount(nums.size(),0);for(i = 0; i < m; ++i){count += nums[i].size();//总个数n = max(n, int(nums[i].size()));//列最大个数}x = y = i = j = 0;while(c < count){i = x, j = y;//x,y起始位置while(i>=0 && j<n && c<count){if(j < nums[i].size())//在范围内{ans.push_back(nums[i][j]);c++;//计数+1precount[i]++;//该行写入答案数量+1if(precount[i]==nums[i].size())//这行写完了{if(precount[finishi+1] == nums[finishi+1].size())finishi++;//检查已完成的行,能不能往下挪}}i--;j++;if(i <= finishi)break;}x++;if(x >= m){x = m-1;y++;}}return ans;}
};

赛后解1:(依然超时)

实际上是按点的位置(r,c)排序:总的是r+c小的靠前,一样的话,r 大的靠前。

class Solution {
public:vector<int> findDiagonalOrder(vector<vector<int>>& nums) {int i, j;vector<vector<int>> v; //posx+posy, posx, valfor(i = 0; i < nums.size(); ++i){for(j = 0; j < nums[i].size(); ++j){v.push_back({i+j, i, nums[i][j]});}}sort(v.begin(), v.end(),[&](auto a, auto b){if(a[0]==b[0])return a[1] > b[1];return a[0] < b[0];});vector<int> ans(v.size());i = 0;for(auto& vi : v)ans[i++] = vi[2];return ans;}
};

估计是排序时间复杂度还是太高。


赛后解2:

  • 按照两个坐标值的和分组,存入map,内层再嵌套map(x,val)
  • 外层顺序遍历(坐标和小的先),内层逆序遍历(x大的先)
class Solution {
public:vector<int> findDiagonalOrder(vector<vector<int>>& nums) {int i, j, size = 0;map<int,map<int,int>> m;//posx+posy, posx, valfor(i = 0; i < nums.size(); ++i){for(j = 0; j < nums[i].size(); ++j){m[i+j][i] = nums[i][j];size++;}}vector<int> ans(size);i = 0;for(auto it = m.begin(); it != m.end(); ++it){for(auto it1 = it->second.rbegin(); it1 != it->second.rend(); ++it1)ans[i++] = it1->second;}return ans;}
};

在这里插入图片描述
或者用数组做,参考lc题解,也是按坐标和分组,每组里面逆序写入答案。

4. LeetCode 5180. 带限制的子序列和 hard

题目链接

给你一个整数数组 nums 和一个整数 k ,请你返回 非空 子序列元素和的最大值
子序列需要满足:子序列中每两个 相邻 的整数 nums[i] 和 nums[j] ,它们在原数组中的下标 i 和 j 满足 i < j 且 j - i <= k

数组的子序列定义为:将数组中的若干个数字删除(可以删除 0 个数字),剩下的数字按照原本的顺序排布。

示例 1:
输入:nums = [10,2,-10,5,20], k = 2
输出:37
解释:子序列为 [10, 2, 5, 20] 。示例 2:
输入:nums = [-1,-2,-3], k = 1
输出:-1
解释:子序列必须是非空的,所以我们选择最大的数字。示例 3:
输入:nums = [10,-2,-10,-5,20], k = 2
输出:23
解释:子序列为 [10, -2, -5, 20] 。提示:
1 <= k <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4

解答:

  • 此题跟 LeetCode 239. 滑动窗口最大值(双端队列+单调栈) 非常类似,可以先看这题

  • dp[i] 表示包含 i 位置的 最大子序和

  • deque 里面保持递减状态(dp值递减,实际存储下标),距离超过 k 的,从队头出去

  • 队头(最大的)>0,则 dp[i] = dp[q.front()]+nums[i],否则,dp[i] = nums[i]

  • 然后检查 dp[i] 要入队,队内是否单调递减,不满足,要pop_back()

class Solution {
public:int constrainedSubsetSum(vector<int>& nums, int k) {int i, n = nums.size(), maxsum = INT_MIN;vector<int> dp(n, 0);dp[0] = nums[0];maxsum = nums[0];deque<int> q;q.push_back(0);for(i = 1; i < n; i++) {if(i-q.front() > k)//距离超过k了q.pop_front();if(dp[q.front()] > 0)//最大的大于0,可以变大dp[i] = dp[q.front()]+nums[i];else//不能变大,自己就是自己dp[i] = nums[i];maxsum = max(maxsum,dp[i]);//更新最大值while(!q.empty() && dp[i] >= dp[q.back()])q.pop_back();//不满足单点递减,pop_backq.push_back(i);}return maxsum;}
};

112 ms 14.7 MB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

torch.nn.embedding()

作者&#xff1a;top_小酱油 链接&#xff1a;https://www.jianshu.com/p/63e7acc5e890 来源&#xff1a;简书 内容&#xff1a;上述是以RNN为基础解析的 torch.nn.Embedding(num_embeddings, embedding_dim, padding_idxNone, max_normNone, norm_type2.0, scale_grad_by_fre…

oracle杀死进程时权限不足_在oracle中创建函数时权限不足

我对oracle有一点了解。我试图创建一个如下所示的函数。在oracle中创建函数时权限不足CREATE OR REPLACE FUNCTION "BOOK"."CONVERT_TO_WORD" (totpayable IN NUMBER) RETURN VARCHARAStotlength NUMBER;num VARCHAR2(14);word VARCHAR2(70);word1 VARCHAR…

哇塞,打开一个页面访问了这么多次数据库??

用SQL Server 事件探查器看了一下&#xff0c;哇塞&#xff0c;每打开一个页面都select了n多次数据库&#xff0c;而且很多都是类似的代码&#xff1f;为啥&#xff1f; (1)、二级嵌套绑定数据源 (2)、二级联动 (3)、……多着呢&#xff01; 解决方法&#xff1a; 对于数据不大…

torch.nn

torch.nn 与 torch.nn.functional 说起torch.nn&#xff0c;不得不说torch.nn.functional! 这两个库很类似&#xff0c;都涵盖了神经网络的各层操作&#xff0c;只是用法有点不同&#xff0c;比如在损失函数Loss中实现交叉熵! 但是两个库都可以实现神经网络的各层运算。其他包…

ORACLE使用JOB定时备份数据库

Oracle的备份一般都是在操作系统上完成&#xff0c;因此定时备份Oracle的功能一般都是由操作系统功能完成&#xff0c;比如crontab。但是Oracle的PIPE接口使得在Oracle数据库中通过JOB来备份Oracle变得可能。 这篇文章给出一个简单的例子&#xff0c;说明如何在JOB中定期备份数…

mysql 装载dump文件_mysql命令、mysqldump命令找不到解决

1、解决bash: mysql: command not found 的方法[rootDB-02 ~]# mysql -u root-bash: mysql: command not found原因:这是由于系统默认会查找/usr/bin下的命令&#xff0c;如果这个命令不在这个目录下&#xff0c;当然会找不到命令&#xff0c;我们需要做的就是映射一个链接到/u…

LeetCode 796. 旋转字符串

1. 题目 给定两个字符串, A 和 B。 A 的旋转操作就是将 A 最左边的字符移动到最右边。 例如, 若 A ‘abcde’&#xff0c;在移动一次之后结果就是’bcdea’ 。如果在若干次旋转操作之后&#xff0c;A 能变成B&#xff0c;那么返回True。 示例 1: 输入: A abcde, B cdeab …

【DKN】(一)KCN详解

_ init _&#xff08;&#xff09;函数 参数&#xff1a; self, config, pretrained_word_embedding, pretrained_entity_embedding, pretrained_context_embedding config&#xff1a; 设置的固定的参数&#xff01; pretrained_word_embedding&#xff1a; 根据下面的使用是…

搜索引擎优化经验谈

转自&#xff1a;http://blog.donews.com/zszwyds/archive/2009/08/24/1551179.aspx 费话少说&#xff0c;直入正题。 1. “白马非马”的关键字(词) 很多客户对于自己网站的关键词无从下手&#xff0c;大部分的客户选择都是大而全的关键词&#xff0c;很多的关键词如果选择…

iphone版 天行skyline_Skyline QT

应用标题Skyline QT应用描述An information and feedback gathering tool for our Skyline Queenstown visitor to discover the complex and its array of activities and food and beverage outlets.Welcome to the world of SkylineAre you looking for things to do in New…

LeetCode 788. 旋转数字

1. 题目 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后&#xff0c;我们仍可以得到一个有效的&#xff0c;且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字&#xff0c; 则这个数是有效的。 0, 1, 和 8 被旋转后…

pycharm中无法识别相对路径的问题

这种情况如果在Windows下操作如下&#xff1a; 第一步&#xff1a; 往往拷贝下来的程序是在linux上运行的 第二步&#xff1a; 设置根路径 要调整有python.exe文件的地方&#xff01; 这两个路径要设置成为自己的项目根目录&#xff01;

vue变量传值_Vue各类组件之间传值的实现方式

1、父组件向子组件传值首先在父组件定义好数据&#xff0c;接着将子组件导入到父组件中。父组件只要在调用子组件的地方使用v-bind指令定义一个属性&#xff0c;并传值在该属性中即可&#xff0c;此时父组件的使命完成&#xff0c;请看下面关键代码&#xff1a;:content"i…

Linux常用指令自己备用

~ 和 / 的区别&#xff1a; ~ 是当前用户的目录地址 / 是根目录的地址&#xff08;一般称呼为root&#xff0c;/ 和 /root/ 是有区别的&#xff09; 当用户是root用户时 ~ 代表/root/&#xff0c;即根目录下的root目录 / 代表/ &#xff0c;即根目录 当用户是jack用户时 ~…

『号外』 排名进入3000,特致感谢!

开博半个月来&#xff0c;老孙项目管理成功地闯入了博客园3000名&#xff01;&#xff01; 谢谢博客园的朋友们&#xff01;非常感谢&#xff01;&#xff01;“老孙项目管理”今日排名2975。这样的成绩&#xff0c;老孙没有预料到&#xff0c;开心极了。比奥巴马当选总统&…

qt如和调用linux底层驱动_擅长复杂硬件体系设计,多核系统设计,以及基于RTOS或者Linux,QT等进行相关底层驱动。...

双向可控硅在使用时&#xff0c;其触发限流电阻的阻值和封装应该怎么选取&#xff1f;(1)首先我们在进行TRIAC其驱动电路设计的时候&#xff0c;我们一般不直接进行驱动&#xff0c;而是通过DIAC或者Photo-TRIAC即光学的双向可控硅配合来使用进行驱动电路的设计&#xff0c;为什…

学习:Web安装项目创建桌面快捷方式及重写安装类(转)

一、WEB安装项目部署1、新建: 新建项目-安装和部署项目-WEB安装项目 2、部署: (1)进入文件系统视图,"项目-右键-视图-文件系统";也可以直接点"解决方案资源管理器"上部的快捷图标(2)在"WEB应用程序文件夹"添加文件&#xff0c;例如aspx文件,ico文…

12c oracle 激活_Oracle 12C 安装教程

Oracle 12c&#xff0c;全称Oracle Database 12c&#xff0c;是Oracle 11g的升级版&#xff0c;新增了很多新的特性。本章节就为大家介绍Oracle 12c的下载和安装步骤。Oracle 12c下载打开Oracle的官方中文网站&#xff0c;选择相应的版本即可。注意&#xff1a;下载时&#xff…

运行试错合集

试错&#xff1a; 在服务器训练好的参数直接被pycharm映射给覆盖了&#xff01; 记得把这里取消掉&#xff01; 如果在py文件中修改了代码&#xff0c;手动上传&#xff01; 就是上面的upload&#xff01; 运行结果&#xff1a; 运行train的结果 评估阶段&#xff1a; 出错…

LeetCode 806. 写字符串需要的行数

1. 题目 我们要把给定的字符串 S 从左到右写到每一行上&#xff0c;每一行的最大宽度为100个单位&#xff0c;如果我们在写某个字母的时候会使这行超过了100 个单位&#xff0c;那么我们应该把这个字母写到下一行。 我们给定了一个数组 widths &#xff0c;这个数组 widths[0…