LeetCode第108场周赛题解

929. 独特的电子邮件地址

  • 题目难度Easy

每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔。

例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名。

除了小写字母,这些电子邮件还可能包含 '.''+'

如果在电子邮件地址的本地名称部分中的某些字符之间添加句点('.'),则发往那里的邮件将会转发到本地名称中没有点的同一地址。例如,"alice.z@leetcode.com”“alicez@leetcode.com” 会转发到同一电子邮件地址。 (请注意,此规则不适用于域名。)

如果在本地名称中添加加号('+'),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如 m.y+name@email.com 将转发到 my@email.com。 (同样,此规则不适用于域名。)

可以同时使用这两个规则。

给定电子邮件列表 emails,我们会向列表中的每个地址发送一封电子邮件。实际收到邮件的不同地址有多少?

示例:

输入:["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
输出:2
解释:实际收到邮件的是 "testemail@leetcode.com" 和 "testemail@lee.tcode.com"。

提示:

  • 1 <= emails[i].length <= 100
  • 1 <= emails.length <= 100
  • 每封 emails[i] 都包含有且仅有一个 '@' 字符。

思路:

先用'@'分割字符,前半部分用'+'分割后只保留第一部分,并将其中的'.'去除,求得local,然后将localdomain'@'重新连接加入集合,最终集合的长度就是答案。

时间复杂度O(N)​

空间复杂度O(N)

代码:

class Solution:
    def numUniqueEmails(self, emails: List[str]) -> int:
        ans = set()
        for email in emails:
            temp = email.split("@")
            local = temp[0].split('+')[0]
            local = local.replace('.', '')
            domain = temp[1]
            ans.add('@'.join([local, domain]))
        return len(ans)

930. 和相同的二元子数组

  • 题目难度Medium

在由若干 01 组成的数组 A 中,有多少个和为 S非空子数组。

示例:

输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
四个子区间分别是:
[0, 2]
[0, 3]
[1, 4]
[2, 4]

提示:

  1. A.length <= 30000
  2. 0 <= S <= A.length
  3. A[i]01

思路:

一次遍历,从前往后枚举区间终点,同时用一个数组记录当前不同前缀和的数量,用f[i]代表和为i的前缀和个数。假设枚举的当前坐标是j,那么我们的目标就是计算j之前共有多少个前缀和是sum[j] - S,这个值就是f[sum[j] - S]。由于遍历过程中,每个前缀和sum[j]只用了一次,所以我们可以用一个变量s来表示,减少空间复杂度。

时间复杂度O(N)​

空间复杂度O(N)​

代码:

class Solution:
    def numSubarraysWithSum(self, A: List[int], S: int) -> int:
        s = 0
        f = [0] * (len(A) + 1)
        f[0] = 1
        ans = 0
        for i in A:
            s += i
            if s >= S:
                ans += f[s - S]
            f[s] += 1
        return ans

931. 下降路径最小和

  • 题目难度Medium

给定一个方形整数数组 A,我们想要得到通过 A下降路径最小和。

下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。

示例:

输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:12
解释:
可能的下降路径有:
  • [1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
  • [2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
  • [3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]

和最小的下降路径是 [1,4,7],所以答案是 12

提示:

  1. 1 <= A.length == A[0].length <= 100
  2. -100 <= A[i][j] <= 100

思路:

动态规划入门题,和POJ1163基本相同,自底向上动态规划,(其实自顶向下也一样),状态转移方程为:A[row][col] += min(A[row + 1][col - 1], A[row + 1][col], A[row + 1][col + 1])

时间复杂度O(N^2)​

空间复杂度O(1)

代码:

class Solution:
    def minFallingPathSum(self, A: List[List[int]]) -> int:
        l = len(A)
        if l == 1:
            return A[0][0]
        for row in range(l - 2, -1, -1):
            A[row][0] += min(A[row + 1][0], A[row + 1][1])
            A[row][-1] += min(A[row + 1][-1], A[row + 1][-2])
            for col in range(1, l - 1):
                A[row][col] += min(A[row + 1][col - 1], A[row + 1][col], A[row + 1][col + 1])
        return min(A[0])

932. 漂亮数组

  • 题目难度Medium

对于某些固定的 N,如果数组 A 是整数 1, 2, ..., N 组成的排列,使得:

对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]

那么数组 A 是漂亮数组。

给定 N,返回任意漂亮数组 A(保证存在一个)。

示例 1:

输入:4
输出:[2,1,4,3]

示例 2:

输入:5
输出:[3,1,2,5,4]

提示:

  • 1 <= N <= 1000

思路:

分治法:

  1. 对于一个连续的数列1,2,3,…,n,如果按照奇偶分成两部分,1,3,5,… 放到左边,2,4,6,8,…放到右边。这样重新安排后,如果i属于左边,j属于右边,A[i]+A[j] 就必定是奇数,因而不存在 A[k],满足 A[k]∗2=A[i]+A[j]
  2. 接下来再看每一部分的内部,由于 1,3,5,…也是等差数列,所以可以经过变换再次变成1,2,3,…,且变换后的数列如果满足题目的性质,则原数列同样满足。如果我们仍然按照 1 中的策略进行奇偶分离,则可以继续分为两部分递归处理。同理 2,4,6,… 也可以进行变换然后递归。
  3. 最后递归的出口是仅有一个数字时,直接返回。

时间复杂度O(NlogN)

空间复杂度O(N)​

代码:

class Solution:
    def beautifulArray(self, N: int) -> List[int]:
        if N == 1:
            return [1]
        if N == 2:
            return [1, 2]
        ans = [i for i in range(1, N + 1)]
        
        def change(A):
            if len(A) <= 1:
                return A
            A1 = []
            A2 = []
            for i in range(len(A)):
                if i % 2 == 0:
                    A1.append(A[i])
                else:
                    A2.append(A[i])
            return change(A1) + change(A2)
        
        return change(ans)

更简单的写法:

class Solution:
    def beautifulArray(self, N: int) -> List[int]:
        def helper(nums):
            return helper(nums[::2]) + helper(nums[1::2]) if len(nums) > 2 else nums
        return helper(list(range(1,N + 1)))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,345评论 0 2
  • 917. 仅仅反转字母 题目难度Easy 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留...
    独孤岳阅读 545评论 0 0
  • 925. 长按键入 题目难度Easy 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可...
    独孤岳阅读 599评论 0 0
  • 922. 按奇偶排序数组 II 题目难度Easy 给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数...
    独孤岳阅读 452评论 0 0
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 3,878评论 1 10