LeetCodeWeeklyContest-158

Leetcode 1224:掷骰子模拟(超详细的解法!!!) 一个正整数组 nums,请你帮忙从该数组中找能满足下面要最长 前缀,并返回其长度: 从前缀中 删除一个 元素后,使得所剩下的每个字的次数相同。 如果删除这个元素后没有剩余元素存在,仍可认为每个字都具有相同次数(也就是 0 次)。 示例 1: 输入:nums = [2,2,1,1,5,3,3,5] 输:7 解释:对于长度为 7 的子数组 [2,2,1,1,5,3,3... 阅读详情

戒骄戒躁,勇往直前。

传送门:第 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],里面每个数字都出现了两次。

思路

参考题解:

打两次表,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;
    }
};

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

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

深入解读ATPG Pattern类型:除了Basic Scan,Clock PO和RAM Sequential模式怎么用? 本文深入解析ATPG高级Pattern类型,包括Clock PO和RAM Sequential模式的应用策略。通过Mentor DFT工具链中的Tessent平台,详细介绍了这些模式的工作原理、配置命令及实战案例,帮助提升芯片测试的故障覆盖率和效率。特别适用于处理时钟域交叉和嵌入式存储器的复杂电路测试需 阅读详情

相关推荐

Windows10下部署Heygem进行字人生成

对于使用Heygem生成字人,需要注意几个问题: + 需要使用Nvidia的显卡。 + 需要在Windows上进行本地部署。主要原因为客户端是Windows的,客户端对上传的视频写入硬编码的`D:\heygem_data\voice\data`目录,需要在容器上读取这些文件。 + 需要在Windows上部署Docker,将Windows的目录映射到容器中,由容器中的服务进行读取。 + 需要特别注意,一定要有D盘,这个D盘是Windows的D盘,不能是插入的USB设备后产生的D盘。 + 需要下载3个Doc

冀辉的博客 5520

1695 删除子数组的最大得分(滑动窗口、前缀和、字典)

1. 问题描述: 给你一个正整数组 nums ,请你从中删除一个含有若干不同元素的子数组。删除子数组的得分就是子数组各元素之和 。返回只删除一个数组可获得的最大得分 。如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个数组。 示例 1: 输入:nums = [4,2,4,5,6] 输:17 解释:最优子数组是 [2,4,5,6] 示例 2: 输入:nums = [5,2,1,2,5,2,1,2,5] 输:8 解释:

二哈 434

比赛倒计时软件.zip

比赛倒计时软件,加入声音及投屏图片,该软件作者已在多次路演大赛活动中使用过。有需要的朋友请下载。本程序全开源。C# WPF制作

LeetCode】1695. 删除子数组的最大得分

class Solution4 { /* 1695. 删除子数组的最大得分 给你一个正整数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个数组。 */ public int maximumUniqueSubarray(int[] nums)..

DrugHua的博客 244

LeetCode1224. 最大相等频率【思维】

一个正整数组 nums,请你帮忙从该数组中找能满足下面要最长 前缀,并返回其长度: 从前缀中 删除一个 元素后,使得所剩下的每个字的次数相同。 如果删除这个元素后没有剩余元素存在,仍可认为每个字都具有相同次数(也就是 0 次)。 示例 1: 输入: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],里面每个字都现了两次。 示例

ln2037的博客 482

LeetCode No.1224 最大相等频率(Hard)

最大相等频率题目描述解题思考代码总结 题目描述 给一个正整数组 nums,请你帮忙从该数组中找能满足下面要最长 前缀,并返回其长度: 从前缀中 删除一个 元素后,使得所剩下的每个字的次数相同。 如果删除这个元素后没有剩余元素存在,仍可认为每个字都具有相同次数(也就是 0 次)。 示例 1: 输入:nums = [2,2,1,1,5,3,3,5] 输:7 解释:对于...

XIVIVV的博客 1261

Leetcode 5225』最大相等频率

『题目』:  给一个正整数组nums,请你帮忙从该数组中找能满足下面要最长 前缀,并返回其长度: 从前缀中 删除一个 元素后,使得所剩下的每个字的次数相同。 如果删除这个元素后没有剩余元素存在,仍可认为每个字都具有相同次数(也就是 0 次)。 『限制条件』: 2 <= nums.length <= 10^5 1 <= nums[i] <= 10...

Gavinjou大笨象的博客 637

LeetCode第181场周赛:5367. 最长快乐前缀(kmp)

「快乐前缀」是在原字符串中既是非空 前缀也是后缀(不包括原字符串自身)的字符串。 给你一个字符串 s,请你返回它的 最长快乐前缀。 如果不存在满足题意的前缀,则返回一个空字符串。 示例 1: 输入:s = "level" 输:"l" 解释:不包括 s 自己,一共有 4 个前缀("l", "le", "lev", "leve")和 4 个后缀("l", "el", "vel", "...

信仰.的博客 484

LeetCode158场周赛:5225. 最大相等频率(瞎搞)

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

信仰.的博客 498

leetcode刷题日记----数组问题

leetcode关于数组的面试经典问题

vinojie的博客 1150

Leetcode刷题 2021.02.06

Leetcode刷题 2021.02.06Leetcode1423 可获得的最大点Leetcode1695 删除子数组的最大得分Leetcode1630 等差子数组 Leetcode1423 可获得的最大点 几张卡牌 排成一行,每张卡牌都有一个对应的点。点由整数组 cardPoints 给。 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。 你的点就是你拿到手中的所有卡牌的点之和。 给你一个数组 cardPoints 和整 k,请你返回可以获得的最大点

weixin_43447128的博客 264

LeetCode之算法面试之数组1之移动零(283)、移除元素(27)、删除排序数组中的重复项(26)、删除排序数组中的重复项II(80)

数组1、移动零(283)2、删除排序数组中的重复项(26)3、移除元素(27)4、删除排序数组中的重复项II (80) 1、移动零(283) 题目描述: 【简单题】 题目链接 思路分析 2、删除排序数组中的重复项(26) 题目描述: 【简单题】 给定一个排序数组,你需要在 原地 删除重复现的元素,使得每个元素只现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 题目链接 思路分析 3、移除元素(27) 题目描述: 【简单

weixin_45666566的博客 573

算法题:给你一个整形数组,要删除其中一个元素,使得剩余元素的乘积最大。如何找到这个待删除元素?

算法题:给你一个整形数组,要删除其中一个元素,使得剩余元素的乘积最大。如何找到这个待删除元素? ​ 分析情况:当数组中有负的情况 和 没有负的情况 当数组中全是正整型的值 ,就取其中最小的值 当数组中有负的情况时候 奇的负为负,取最小的负的负 取正整最小的值 代码实现 思路: 判断数组中负的个 ​ 1.如果数组中负的个是奇...

飞鱼的博客 1716

9.移除元素(简单)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val = 3, 函应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超新长度后面的元素。 示例 2: 给定 nums = [0,1,2,2,3,0,4,2]

SCU-JJkinging的博客 369

1695 删除子数组的最大得分

题目描述: 给你一个正整数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],…,a[r] ,那么它就是 a 的一个数组。 示例 1: 输入:nums = [4,2,4,5,6] 输:17 解释:最优子数组是 [2,4,5,6] 示例 2: 输入:nums = [5,2,1,2,5,2,1,2,5] 输:8 解释:

weixin_44171872的博客 510

leetcode刷题分类刷题之动态规划

leetcode刷题分类刷题之动态规划入门篇如何使用动态规划简单中等难度困难 入门篇 如何使用动态规划 首先我们要确认是否能使用动态规划 问题的答案依赖于问题的规模 ,也就是说这个问题能否被拆分为一个小规模的问题也就是一个F(N)的问题能否转化为F(i)的问题 F(N) 是否与之前的F(i)答案有关系 也就是能否建立状态转移方程 状态转移方程 也就是我们常说的dp[i] 或者dp[i][j]到底是代表什么 dp[i] 和之前的有什么联系能够用dp [0] --dp[i-1]的值推dp[i] 确认

qq_43529421的博客 606

Leetcode 5630:删除子数组的最大得分

题目描述 给你一个正整数组nums,请你从中删除一个含有若干不同元素的子数组。删除子数组的得分就是子数组各元素之和。 返回只删除一个数组可获得的最大得分。 如果数组b是数组a的一个连续子序列,即如果它等于a[l],a[l+1],...,a[r],那么它就是a的一个数组。 示例 1: 输入:nums = [4,2,4,5,6] 输:17 解释:最优子数组是 [2,4,5,6] 示例 2: 输入:nums = [5,2,1,2,5,2,1...

weixin_35338624的博客 295

Leetcode刷题——数组与字符串篇

二维数组: 498-对角线遍历: 方法1:效率低下 找二维数组的行与列之和的索引规律。 错误提示:Process finished with exit code 139 (interrupted by signal 11: SIGSEGV) 原因:初始化容器的时候未指定长度(vector order;),后面赋值时用到了order[i],这是不允许的,可以用函emplace_back()或者push_back()来把值放入容器。 错误提示:reference binding to null pointe

weixin_44571233的博客 2031

力扣(LeetCode)题解------简单

1、970. 强整 public List&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;Integer&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; powerfulIntegers(int x, int y, int bound) { Set&amp;amp;amp;am

CURD工程师 2777

删除子数组的最大得分

删除子数组的最大得分 给你一个正整数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],…,a[r] ,那么它就是 a 的一个数组。 示例 1: 输入:nums = [4,2,4,5,6] 输:17 解释:最优子数组是 [2,4,5,6] 示例 2: 输入:nums = [5,2,1,2,5,2,1,2,5] 输

weixin_43327597的博客 337
上一篇: LeetCodeWeeklyContest-157
下一篇: 最长公共子序列(LongestCommonSubsequence)
SinclairWang
博客等级 码龄8年 63粉丝 109原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值