首页 > 其他分享 >Leetcode 第 135 场双周赛题解

Leetcode 第 135 场双周赛题解

时间:2024-08-03 23:52:51浏览次数:7  
标签:code 题目 lc nums int 题解 复杂度 双周 Leetcode

Leetcode 第 135 场双周赛题解

Leetcode 第 135 场双周赛题解

题目1:3222. 求出硬币游戏的赢家

思路

要用价值为 75 和 10 的硬币凑出价值总和为 115 的硬币,唯一的可能是 1 个 75 + 4 个 10。

如果一开始 Alice 就没法选,或者偶数轮后 Alice 没法选,那么 Bob 胜出,否则 Alice 胜出。

设 k=min(x, ⌊y/4⌋),这是能玩的回合数,判断 k 的奇偶性即可。

代码

/*
 * @lc app=leetcode.cn id=3222 lang=cpp
 *
 * [3222] 求出硬币游戏的赢家
 */

// @lc code=start
class Solution
{
public:
    string losingPlayer(int x, int y)
    {
        return min(x, y / 4) % 2 ? "Alice" : "Bob";
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目2:3223. 操作后字符串的最短长度

思路

操作次数取决于每种字母的出现次数,与字母的位置无关。

假设某个字母出现了 c 次,那么操作后该字母最少能剩下多少?

根据题意,只有当 c≥3 时才能操作,每次操作可以把 c 减少 2。

  • 如果 c=3, 5, 7,⋯ 是奇数,那么不断减 2,最终 c=1。
  • 如果 c=4, 6, 8,⋯ 是偶数,那么不断减 2,最终 c=2。

累加每种字母最终剩下的 c,即为答案。

代码

/*
 * @lc app=leetcode.cn id=3223 lang=cpp
 *
 * [3223] 操作后字符串的最短长度
 */

// @lc code=start
class Solution
{
public:
    int minimumLength(string s)
    {
        unordered_map<char, int> freq;
        for (char &c : s)
            freq[c]++;

        int ans = 0;
        for (auto &[c, cnt] : freq)
            ans += cnt % 2 ? 1 : 2;
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n+∣Σ∣),其中 n 是字符串 s 的长度,∣Σ∣ 是字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

空间复杂度:O(∣Σ∣),其中 ∣Σ∣ 是字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

题目3:3224. 使差值相等的最少数组改动次数

思路

想一想,什么情况下答案是 0?什么情况下答案是 1?

如果答案是 0,意味着所有 ∣nums[i]−nums[n−1−i]∣ 都等于同一个数 X。

如果答案是 1,意味着有 n/2−1 个 ∣nums[i]−nums[n−1−i]∣ 都等于同一个数 X。我们只需要修改那对不相等的,设这两个数分别为 p=nums[i], q=nums[n−1−i]。

不妨设 p≤q,分类讨论:

  • 如果修改 p,那么把 p 改成 0 可以让差值尽量大,此时差值为 q。
  • 如果修改 q,那么把 q 改成 k 可以让差值尽量大,此时差值为 k−p。
  • 如果 max(q,k−p)≥X,改其中一个数就行。
  • 如果 max(q,k−p)<X,p 和 q 两个数都要改。

注意题目保证 n 是偶数。

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=3224 lang=cpp
 *
 * [3224] 使差值相等的最少数组改动次数
 */

// @lc code=start
class Solution
{
public:
    int minChanges(vector<int> &nums, int k)
    {
        vector<int> cnt(k + 1), cnt2(k + 1);
        int n = nums.size();
        for (int i = 0; i < n / 2; i++)
        {
            int p = nums[i], q = nums[n - 1 - i];
            if (p > q)
            { // 保证 p <= q
                swap(p, q);
            }
            cnt[q - p]++;
            cnt2[max(q, k - p)]++;
        }

        int ans = n;
        int sum2 = 0; // 统计有多少对 (p,q) 都要改
        for (int x = 0; x <= k; x++)
        {
            // 其他 n/2-cnt[x] 对 (p,q) 至少要改一个数,在此基础上,有额外的 sum2 对 (p,q) 还要再改一个数
            ans = min(ans, n / 2 - cnt[x] + sum2);
            // 对于后面的更大的 x,当前的这 cnt2[x] 对 (p,q) 都要改
            sum2 += cnt2[x];
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n+k),其中 n 是数组 nums 的长度。

空间复杂度:O(k)。

题目4:

思路

代码

在这里插入代码片

复杂度分析

时间复杂度:O()。

空间复杂度:O()。

标签:code,题目,lc,nums,int,题解,复杂度,双周,Leetcode
From: https://blog.csdn.net/ProgramNovice/article/details/140899027

相关文章

  • leetcode 021:删除链表的倒数第 N 个结点
    LCR021.删除链表的倒数第N个结点给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:输入:head=[1,2],n=1输出:[1]structListNode*removeNthF......
  • LeetCode | 160 Intersection of two linkedlists
    https://github.com/dolphinmind/datastructure/tree/datastructure-linkedlist分析判断两个链表是否相交,转换成了双指针相遇的问题。还是那句话,双指针的本质是遍历,走的路其实一样/***解决两个链接不相交而陷入无限循环的情况*初......
  • 【leetcode详解】正方形中的最多点数【中等】(C++思路精析)
    思路精析:自定义结构体解读:一个点是否在题给正方形中,只取决于其横纵坐标的最大值,记为dis沟通二位数组points和字符串s的桥梁,就是这个点的序号,记为idx由此自定义结构体,储存dis和idx//其中booloperator部分的功能:重载小于操作符“<”,使sort(vc.begin(),vc.end());按dis......
  • CodeForces-808#D 题解
    思路分析分析样例1:3132原数组被分成1和32两部分,将2移到左边即可。我们设左边部分的和为\(s1\),右边为\(s2\),可以发现对于任何分割方式,只有满足\(s1\pmx=s2\mpx\)才可以继续讨论答案是否成立。推论1:由于\(x\ina\)(\(a\)为题目所给数列),因此\(|\s1-s2......
  • 洛谷 统计天数 + 语句解析 题解
    题目:P1567统计天数P1597语句解析第一道:P1567统计天数题目描述炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。经历千辛万苦,他收集了连续 N(1≤N≤10^6)天的最高气温数据。现在......
  • AGC064B 题解
    设红色的点值为0,蓝色为1。注意到,如果有一条边的颜色和两端点同色,一定可以选。例子:选择和两端点同色的边。又发现,如果存在一个\(sz>1\)的合法连通块,无论和其他点怎么连,原来的这个连通块内的点一定合法。有注意到形如\(0\xleftrightarrow10,1\xleftrightarrow01\)类......
  • P9351 题解
    P9351思路观察到一次覆盖操作相当于\((u,v)\)向\((u,v)\)为中心的一个矩形挖去四个角中每个点连代价为\(1\)的边。因为\(r\lec\),\(r\le\sqrt{rc}\)。暴力是01bfs,到每个点处理覆盖操作时枚举行一边,用\(n\)个并查集维护每行没有被删去的后继。对于每个点需要枚举\(......
  • 代码随想录算法训练营Day18 | Leetcode 530 二叉搜索树的最小绝对差 Leetcode 236 二
    前言今天有一道题目没写,二叉搜索树中的众数,有点太难理解了,先放一放。Leetcode530二叉搜索树的最小绝对差题目链接:530.二叉搜索树的最小绝对差-力扣(LeetCode)代码随想录题解:代码随想录(programmercarl.com)思路:二叉搜索树的性质是中序遍历为升序的,所以我们想找最小绝......
  • 20240803题解
    话说T3都把式子推出来了结果忘记差分约束怎么写了。光线(light)题面:有\(n\)个玻璃板,第\(i\)个玻璃板的透光率为\(a_i\%\),反射率为\(b_i\%\),有大小为\(1\)个单位的一束光从第\(1\)个玻璃板开始,有多少光能穿透\(n\)层玻璃板。题解:考虑\(n=2\)时,可以简单算出两个玻璃板组合后的反......
  • 第三次测试题解
    问题F:求多个数的最大公约数multigcd[1*]:`#includeincludeincludeincludeusingnamespacestd;intfun(inta,intb){returnb==0?a:fun(b,a%b);}intmain(){intn;cin>>n;vectora(n+1,0);for(inti=1;i<=n;i++)scanf("%d",&a[i]);intans......