LeetCodeWeeklyContest-158

2024-01-01 06:58
文章标签 158 leetcodeweeklycontest

本文主要是介绍LeetCodeWeeklyContest-158,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

戒骄戒躁,勇往直前。

传送门:第 158 场周赛

分割平衡字符串

在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。
给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。
返回可以通过分割得到的平衡字符串的最大数量。
输入:s = “RLRRLLRLRL”
输出:4
解释:s 可以分割为 “RL”, “RRLL”, “RL”, “RL”, 每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’。

思路

用两个数组记录当前出现的R和L的次数,进行比对相等则cnt+1。

实现

class Solution {
public:int balancedStringSplit(string s) {int n = s.length(),cnt=0;int rcnt[n]={0},lcnt[n]={0};for(int i=0;i<s.length();i++){rcnt[i]=(i==0?0:rcnt[i-1]);lcnt[i]=(i==0?0:lcnt[i-1]);if(s[i]=='R')  rcnt[i]++;if(s[i]=='L')  lcnt[i]++;if(lcnt[i]==rcnt[i]) cnt++; }return cnt;}
};

可以攻击国王的皇后

在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。
「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示。
「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。
请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。

思路

第一反应想起了8皇后,基本上还是以国王为中心遍历8个方向,在一个方向碰到一个皇后,就立刻停止,push进result,然后遍历剩余的方向。
注意:vector数组的初始化。

实现

class Solution {
public:vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {vector<vector<int> > res;vector<int> tmp(queens[0].size()); // 要初始化 不然报 reference binding to null pointer of type ‘value_type’vector<vector<int> >::iterator it;int dx[8]={-1,0,1,-1,1,-1,0,1};int dy[8]={-1,-1,-1,0,0,1,1,1};for(int i=0;i<8;i++){tmp[0]=king[0],tmp[1]=king[1];while(1){tmp[0] = tmp[0]+dx[i];tmp[1] = tmp[1]+dy[i];if(tmp[0]>=0&&tmp[0]<8&&tmp[1]>=0&&tmp[1]<8){it = find(queens.begin(),queens.end(),tmp);  // 最近用find老是出错if(it!=queens.end()){res.push_back(tmp);break;}}else break;      }                      }return res;}
};

掷骰子模拟

有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。
不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号)。
现在,给你一个整数数组 rollMax 和一个整数 n,请你来计算掷 n 次骰子可得到的不同点数序列的数量。
假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的。由于答案可能很大,所以请返回 模 10^9 + 7 之后的结果。

思路1

请参考 [Chinese/C++] 1223. 【动态规划】有限制的掷骰子(详解)

实现1

class Solution{vector<int> rollMax ;typedef long long ll;int dp[5005][6][16];int mod = 1e9+7;ll dfs(int num,int k,int n){if(n==0) return 1;if(dp[n][num][k]!=-1) return dp[n][num][k];ll ans =0;for(int i=0;i<6;i++){if(i!=num) ans += dfs(i,1,n-1);else if(k<rollMax[i])   // 注意不能等于,如果等于就不能加一了。ans += dfs(num,k+1,n-1);else ;}return dp[n][num][k]=ans%mod;}public :int  dieSimulator(int n, vector<int>& rollMax) {this->rollMax = rollMax;memset(dp,-1,sizeof(dp));return dfs(0,0,n)%mod;}
};

思路2

用一个三维数组表示的话。v[k][i][j]表示第k轮扔出i点的骰子,并且这个点数已经连续出现j次时的序列的个数。
如果下一轮的点数和这一轮最后的点数不同的时候:v[k+1][c][1] += v[k][i][j]
如果下一轮的点数和这一轮最后的点数相同并且依然不超过这个点最大的可连续限制的时候:v[k+1][i][j+1] += v[k][i][j]

不过尝试实现了一下,一直显示结果为0,不清楚为什么。欢迎讨论。

class Solution {
public:typedef long long ll;int  dieSimulator(int n, vector<int>& rollMax) {int mod = 1e9+7;int dp[5002][8][16]={0};for(int i=0;i<6;i++){dp[1][i][1]=1;}for(int k=2;k<=n;k++){for(int i=0;i<6;i++){for(int j=1;j<k&&j<16;j++){for(int c=0;c<6;c++){if(c!=i) dp[k+1][c][1] = (dp[k+1][c][1]+dp[k][i][j])%mod;else if(j<=rollMax[i]) dp[k+1][i][j+1] = (dp[k+1][i][j+1]+dp[k][i][j])%mod;}}}}ll res = 0;for(int i=1;i<6;i++){for(int j=1;j<n;j++){res = (res+dp[n][i][j])%mod;}}return res;}
};

最大相等频率

给出一个正整数数组 nums,请你帮忙从该数组中找出能满足下面要求的 最长 前缀,并返回其长度:
从前缀中 删除一个 元素后,使得所剩下的每个数字的出现次数相同。
如果删除这个元素后没有剩余元素存在,仍可认为每个数字都具有相同的出现次数(也就是 0 次)。
举个例子
输入:nums = [2,2,1,1,5,3,3,5]
输出:7
解释:对于长度为 7 的子数组 [2,2,1,1,5,3,3],如果我们从中删去 nums[4]=5,就可以得到[2,2,1,1,3,3],里面每个数字都出现了两次。

思路

参考题解:

  • Chinese/C++ ] 1224. 【统计】最大相等频率,详解,O(N)
  • C++,O(n),consider for four situations

打两次表,cnt表是用来记录每种数字出现的次数,freq表记录每个次数出现的频率,其中需要考虑四种情况。

  1. 只有频率为A或B的序列,其中A=B+1,比如:[7,7,7,8,8,9,9] 其中A=3,B=2
  2. 只有频率为A或B的序列,其中A=1,B!=1 比如:[6,7,7,7,8,8,8,9,9,9] 其中A=1,B=3
  3. 每个数字只出现1次 比如:[7,8,9]
  4. 所有数字相同,比如:[7,7,7,7,7]

对于情况1,4:1+freq[maxcnt-1]*(maxcnt-1)==i+1 其中i为nums的当前索引,等式的意义是 从索引等于0到索引等于i之间的元素个数相等。
对于情况2:1+freq[maxcnt]*maxcnt ==i+1 等式意义同上。
上述三种情况 所求结果即此时索引i加1(i>=0&&i<nums.size())
对于情况3:只需 maxcnt ==1,所求结果即为整个nums的长度。

实现

class Solution {
public:int maxEqualFreq(vector<int>& nums) {vector<int> cnt(100003,0),freq(100003,0);int maxcnt = 0,ans = 0;for(int i=0;i<nums.size();i++){int num = nums[i];cnt[num]++;freq[cnt[num]]++;maxcnt = max(maxcnt,cnt[num]);// cout << num << " " << cnt[num] << " " <<  freq[cnt[num]] << " " << maxcnt << endl; if(1+freq[maxcnt-1]*(maxcnt-1)==i+1||1+freq[maxcnt]*maxcnt==i+1) ans = i+1;         }if(maxcnt==1) ans = nums.size();return ans;}
};

写这次的题解并没有想象中的欢快~

所以动心忍性,曾益其所不能。

这篇关于LeetCodeWeeklyContest-158的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558465

相关文章

LeetCode 题解(158): Gray Code

题目: The gray code is a binary numeral system where two successive values differ in only one bit. Given a non-negative integer n representing the total number of bits in the code, print the sequenc

【158】Linux 命令神器:lsof

内容目录(原文见公众号python宝) 一、lsof命令介绍二、lsof命令功能和常用的参数列表三、常用命令www.xmmup.com 一、lsof命令介绍   lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如TC和UDP等,系统在后台都为该应用程序分配了一个

数据库管理-第158期 Oracle Vector DB AI-09(20240304)

数据库管理158期 2024-03-04 数据库管理-第158期 Oracle Vector DB & AI-09(20240304)1 创建示例表2 添加过滤条件的向量近似查询示例1示例2示例3示例4示例5示例6示例7 总结 数据库管理-第158期 Oracle Vector DB & AI-09(20240304) 作者:胖头鱼的鱼缸(尹海文) Oracle ACE As

jvm做了什么?(68h)158

one.内存与垃圾回收 一.JVM的整体结构(主要针对于HotSpot) 常见的虚拟机:HotSpot, J9, JRockit  二.虚拟机的生命周期 a.启动->Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的, 这个类由虚拟机的具体实现来指定; b.执行-> 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序. 所以, Java虚拟机在Jav

CTFshow web(文件上传158-161)

web158 知识点: auto_append_file 是 PHP 配置选项之一,在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时,PHP 将在执行完脚本文件的所有

(158)两个字符串是变位词

容易 两个字符串是变位词 查看运行结果  写出一个函数 anagram(s, t) 去判断两个字符串是否是颠倒字母顺序构成的 您在真实的面试中是否遇到过这个题?  Yes 样例 给出 s="abcd",t="dcab",返回 true public class Solution {/*** @param s: The first string* @para

CTFshow web(php文件上传155-158)

web155                                                      老样子,还是那个后端检测。 知识点: auto_append_file 是 PHP 配置选项之一,在 PHP 脚本执行结束后自动

佳明手表158如何设置屏幕壁纸--佳明 face it

因为在ConnectIQ设置了壁纸没有直接生效,所以才有了这篇文章,第二天设置完壁纸手表屏幕提示--在下一次同步时更新--同步时也立马设置上了,但是原先的壁纸已经找不到了。不太明白佳明face it里面的运行逻辑;但是对于设置不生效的朋友可以尝试一下步骤看看 第一步:在ConnectIQ里面找到Face it,然后点击+选择自己喜欢的照片,并选择自己合适的表盘格式; 第二步:点击安装; 第三步:

LeetCodeWeeklyContest-160

题目传送门 找出给定方程的正整数解 签到题的新包装,我没有玩过的船新版本。 class Solution {public:vector<vector<int>> findSolution(CustomFunction& c, int z) {vector<vector<int>> res;for(int i=1;i<=1000;i++){for(int j=1;j<=1000;j++){i

LeetCodeWeeklyContest-159

最近看了篇文章,文章里说 希望你身边能有个比你聪明五倍,但却比你还努力十倍的人。 倍数虽然有些夸张,但是这个思想还是能get到的。 5230. 缀点成线 在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。 请你来判断,这些点是否在该坐标系中属于同一条直线上,是则