首页 > 其他分享 >[Leetcode Weekly Contest]355

[Leetcode Weekly Contest]355

时间:2023-07-24 19:55:04浏览次数:44  
标签:nums int usageLimits Contest 节点 355 数组 字符串 Leetcode

链接:LeetCode

[Leetcode]6921. 按分隔符拆分字符串

给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。
返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。
注意

  • separator 用于决定拆分发生的位置,但它不包含在结果字符串中。
  • 拆分可能形成两个以上的字符串。
  • 结果字符串必须保持初始相同的先后顺序。

遍历split即可,注意在Java中split默认是regex类型,需要加转义"\\".

class Solution {
    public List<String> splitWordsBySeparator(List<String> words, char separator) {
        List<String> res = new ArrayList<>();
        for(String word: words) {
            for(String subWord: word.split("\\"+separator)) {
                if(!subWord.isEmpty())res.add(subWord);
            }
        }
        return res;
    }
}

[Leetcode]2789. 合并后数组中的最大元素

给你一个下标从 0 开始、由正整数组成的数组 nums 。
你可以在数组上执行下述操作 任意 次:

  • 选中一个同时满足 0 <= i < nums.length - 1 和 nums[i] <= nums[i + 1] 的整数 i 。将元素 nums[i + 1] 替换为 nums[i] + nums[i + 1] ,并从数组中删除元素 nums[i] 。

返回你可以从最终数组中获得的 最大 元素的值。
从后往前遍历数组,设置一个迭代变量last,如果last>=nums[i],则迭代变量last+=nums[i],否则last=nums[i],在遍历过程中更新res

class Solution {
    public long maxArrayValue(int[] nums) {
        int n = nums.length;
        long res = nums[n-1], last = nums[n-1];
        for(int i = nums.length-2; i>=0;--i) {
            if(nums[i] <= last) last += nums[i];
            else last = nums[i];
            res = Math.max(res, last);
        }
        return res;
    }
}

[Leetcode]6955. 长度递增组的最大数目

给你一个下标从 0 开始、长度为 n 的数组 usageLimits 。
你的任务是使用从 0 到 n - 1 的数字创建若干组,并确保每个数字 i 在 所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件:

  • 每个组必须由 不同 的数字组成,也就是说,单个组内不能存在重复的数字。
  • 每个组(除了第一个)的长度必须 严格大于 前一个组。
    在满足所有条件的情况下,以整数形式返回可以创建的最大组数。

二分+贪心。对于一个给定的usageLimits,我们只在乎usageLimits中数字的大小,并不在乎它实际所对应的值是多少,假设我们要满足groups=3,则最小目标序列为[3,2,1],满足要求的usageLimits可以为[4,5,6],[3,2,1,5]... 问题可以重新描述为,对于一个给定的usageLimits和groups,能否从usageLimits中找到对应的最小目标序列target,然后对groups进行二分即可。

class Solution {
    private boolean check(List<Integer> usageLimits, int n) {
        int needed = 0;
        int cur = n;
        for(int usageLimit: usageLimits) {
            if(usageLimit < cur) needed += cur - usageLimit;
            else needed -= Math.min(needed, usageLimit-cur);
            if(cur > 0) cur -- ;
        }
        return needed == 0;
    }


    public int maxIncreasingGroups(List<Integer> usageLimits) {
        Collections.sort(usageLimits, (a,b) -> b-a);
        int lo = 1, hi = usageLimits.size();
        while(lo <= hi) {
            int mid = lo+((hi-lo) >> 1);
            if(check(usageLimits, mid)) lo = mid+1;
            else hi = mid - 1;
        }
        return hi;
    }
}

[Leetcode]2791. 树中可以形成回文的路径数

给你一棵 树(即,一个连通、无向且无环的图),根 节点为 0 ,由编号从 0 到 n - 1 的 n 个节点组成。这棵树用一个长度为 n 、下标从 0 开始的数组 parent 表示,其中 parent[i] 为节点 i 的父节点,由于节点 0 为根节点,所以 parent[0] == -1 。
另给你一个长度为 n 的字符串 s ,其中 s[i] 是分配给 i 和 parent[i] 之间的边的字符。s[0] 可以忽略。
找出满足 u < v ,且从 u 到 v 的路径上分配的字符可以 重新排列 形成 回文 的所有节点对 (u, v) ,并返回节点对的数目。
如果一个字符串正着读和反着读都相同,那么这个字符串就是一个 回文 。

位运算处理, 回文串等价于至多一个字母出现奇数次,其余字母出现偶数次。

class Solution:
    def countPalindromePaths(self, parent: List[int], s: str) -> int:
        n = len(s)
        g = [[] for _ in range(n)]
        for i in range(1, n):
            g[parent[i]].append(i)

        ans = 0
        cnt = Counter([0])  # 一条「空路径」
        def dfs(v: int, xor: int) -> None:
            nonlocal ans
            for w in g[v]:
                bit = 1 << (ord(s[w]) - ord('a'))
                x = xor ^ bit
                ans += cnt[x] + sum(cnt[x ^ (1 << i)] for i in range(26))
                cnt[x] += 1
                dfs(w, x)
        dfs(0, 0)
        return ans

参考:LeetCode

标签:nums,int,usageLimits,Contest,节点,355,数组,字符串,Leetcode
From: https://www.cnblogs.com/hellojamest/p/17578175.html

相关文章

  • LeetCode 热题 100 之 438. 找到字符串中所有字母异位词
    题目给定两个字符串 s 和p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词指由相同字母重排列形成的字符串(包括相同的字符串)。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba"......
  • LeetCode 热题 100 之 3. 无重复字符的最长子串
    题目给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度为1。示例3:......
  • LeetCode 399. 除法求值
    classSolution{public:vector<double>calcEquation(vector<vector<string>>&equations,vector<double>&values,vector<vector<string>>&queries){unordered_set<string>node;//记录所有节点......
  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)
    ToyotaProgrammingContest2023#4(AtCoderBeginnerContest311)A-FirstABC(atcoder.jp)记录一下\(ABC\)是否都出现过了然后输出下标#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(n......
  • leetcode第109场双周赛
    题目传送门6931.访问数组中的位置使分数最大题意给你一个数组,初始你位于下标1处,你可以往后跳到数组任一下标,但不能往前跳。跳到哪个位置,即可获得下标对应的分数,但如果当前下标的数与跳之前下标的数奇偶性不同,那么你会失去分数x。询问你能获得的最大分数?思路一眼动态规划,......
  • LeetCode 周赛上分之旅 #35 两题坐牢,菜鸡现出原形
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和[BaguTreePro]知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告......
  • 「解题报告」Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)
    比赛地址:ToyotaProgrammingContest2023#4(AtCoderBeginnerContest311)-AtCoder后记:大家都太强了%%%,如果我做不出第四题就要掉分了。。。A-FirstABCA-FirstABC(atcoder.jp)找到第一个\(\texttt{A,B,C}\)三种字符都出现的位置。/*Thecodewaswrittenby......
  • leetcode第 109 场双周赛
    6930.检查数组是否是好的-力扣(LeetCode)首先判断数组长度是不是最大值+1,然后排个序,判断0到n-2是不是都是1到最大值的一个排列,满足这些返回true就行了classSolution{public:boolisGood(vector<int>&num){intma=0;for(autoi:num){......
  • The 2023 Guangdong Provincial Collegiate Programming Contest(2023广东省赛)
    链接:https://codeforces.com/gym/104369A.ProgrammingContestC++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;voidsolve(){inty1,y2;cin>>y1;intn;cin>>n;vector<int>......
  • 练习记录-AtCoder Beginner Contest 311-(A-E)
    写的还挺顺的F之后补A-FirstABC找abc三个字母什么时候出现了一次输出即可B-VacationTogether题意:最长的几个人一排里面均有时间#include<bits/stdc++.h>#defineclosestd::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)usingnamespacestd;typedeflon......