Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode Weekly Contest 22(双周赛)

LeetCode Weekly Contest 22(双周赛)

作者头像
wywwzjj
发布于 2023-05-09 06:39:23
发布于 2023-05-09 06:39:23
19700
代码可运行
举报
运行总次数:0
代码可运行

总的来说题目挺简单的。晚上做题注意力没那么集中,看错几次题,浪费不少时间,可惜了。

两个数组间的距离值

题目描述

给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的距离值 。

距离值定义为符合此描述的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d

解法

两重循环遍历一下就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func findTheDistanceValue(arr1 []int, arr2 []int, d int) int {
    ans := 0
    for i := range arr1 {
        flag := true
        for j := range arr2 {
            if abs(arr1[i]-arr2[j]) <= d {
                flag = false
                break
            }
        }
        if flag {
            ans++
        }
    }
   	return ans
}

func abs(x int) int {
    if x > 0 {
        return x
    }
    return -x
}

安排电影院座位

题目描述

如上图所示,电影院的观影厅中有 n 行座位,行编号从 1 到 n ,且每一行内总共有 10 个座位,列编号从 1 到 10

给你数组 reservedSeats,包含所有已经被预约了的座位。比如说,researvedSeats[i] = [3,8] ,它表示第 3 行第 8 个座位被预约了。

请你返回最多能安排多少个 4 人家庭 。4 人家庭要占据 同一行内连续 的 4 个座位。隔着过道的座位(比方说 [3,3] 和 [3,4])不是连续的座位,但是如果你可以将 4 人家庭拆成过道两边各坐 2 人,这样子是允许的。

提示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 <= n <= 10^9
1 <= reservedSeats.length <= min(10*n, 10^4)
reservedSeats[i].length == 2
1 <= reservedSeats[i][0] <= n
1 <= reservedSeats[i][1] <= 10
所有 reservedSeats[i] 都是互不相同的。

解法

由于限制了跨过道的坐法只能有一种,即每边坐两人,所以每一排座位的坐法就只有 4 种情况。

  • 4、5、6、7
  • 2、3、4、5
  • 6、7、8、9
  • 2、3、4、5 和 6、7、8、9

题目求的是最多能安排多少个家庭座位,所以第四种优先安排。

剩下的难点在于数据量比较大,如果直接遍历 n 是会超时的。

注意到 reservedSeats.length <= min(10*n, 10^4),范围比较小,就从这下手。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func maxNumberOfFamilies(n int, reservedSeats [][]int) int {
    m := make(map[int][]bool)
    for _, reservedSeat := range reservedSeats {
        if len(m[reservedSeat[0]]) == 0 {
            m[reservedSeat[0]] = make([]bool, 11)
        }
        m[reservedSeat[0]][reservedSeat[1]] = true
    }
    ans := 0
    for _, isSeat := range m {  // 只关注有座位被占用的部分,整排为空的一定能坐下两家庭
        if isSeat[2] || isSeat[3] || isSeat[8] || isSeat[9] {
            if !isSeat[4] && !isSeat[5] && !isSeat[6] && !isSeat[7] {
                ans++
                continue
            }
        }
        if !isSeat[2] && !isSeat[3] && !isSeat[4] && !isSeat[5] {
            ans++
        }
        if !isSeat[6] && !isSeat[7] && !isSeat[8] && !isSeat[9] {
            ans++
        }
    }
    return 2*(n-len(m)) + ans  // 空座位一定能坐下两个家庭
}

还有一种思路,每个座位只有被占用 / 空两种状态,很容易想到用位运算处理。

将整数按权重排序

题目描述

我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:

如果 x 是偶数,那么 x = x / 2 如果 x 是奇数,那么 x = 3 * x + 1

比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 –> 10 –> 5 –> 16 –> 8 –> 4 –> 2 –> 1)。

给你三个整数 lo, hi 和 k 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序 。

请你返回区间 [lo, hi] 之间的整数按权重排序后的第 k 个数。

注意,题目保证对于任意整数 x (lo <= x <= hi) ,它变成 1 所需要的步数是一个 32 位有符号整数。

提示:

  • 1 <= lo <= hi <= 1000
  • 1 <= k <= hi - lo + 1

解法

一开始纠结了一会求权重,后面发现直接模拟就好了,并不是每次决策,求最小步数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func getKth(lo, hi, k int) int {
    power := make(map[int]int)
    arr := make([]int, hi-lo+1)
    for i := lo; i <= hi; i++ {
        arr[i-lo] = i
        getPower(i, power)
    }

    // 到这里就变成了常规 Top K 问题,简单做下排序吧,注意要稳定排序
    sort.Slice(arr, func(i, j int) bool {
        if power[arr[i]] != power[arr[j]] {
            return power[arr[i]] < power[arr[j]]
        }
        return arr[i] < arr[j] // 相等的留在原地
    })

    return arr[k-1]
}

func getPower(x int, power map[int]int) int {
    ans, tmp := 0, x
    for x != 1 {
        if x&1 == 1 {
            x = 3*x + 1
        } else {
            x /= 2
        }
        ans++
        if val, ok := power[x]; ok {
            ans += val
            break
        }
    }
    power[tmp] = ans
    return ans
}

3n 块披萨

题目描述

给你一个披萨,它由 3n 块不同大小的部分组成,现在你和你的朋友们需要按照如下规则来分披萨:

你挑选任意 一块披萨。

Alice 将会挑选你所选择的披萨逆时针方向的下一块披萨。

Bob 将会挑选你所选择的披萨顺时针方向的下一块披萨。

重复上述过程直到没有披萨剩下。

每一块披萨的大小按顺时针方向由循环数组 slices 表示。

请你返回你可以获得的披萨大小总和的最大值。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [1,2,3,4,5,6]
输出:10
解释:选择大小为 4 的披萨,Alice 和 Bob 分别挑选大小为 35 的披萨。然后你选择大小为 6 的披萨,Alice 和 Bob 分别挑选大小为 21 的披萨。你获得的披萨总大小为 4 + 6 = 10

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [8,9,8,6,1,1]
输出:16
解释:两轮都选大小为 8 的披萨。如果你选择大小为 9 的披萨,你的朋友们就会选择大小为 8 的披萨,这种情况下你的总和不是最大的。

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [4,1,2,5,8,3,1,9,7]
输出:21

示例 4:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:slices = [3,1,2]
输出:3

提示:

  • 1 <= slices.length <= 500
  • slices.length % 3 == 0
  • 1 <= slices[i] <= 1000

解法

这题直接贪心显然不行,两个特点,一个是形成环,并且选了这个,其左右两边的将被丢弃。

很容易联想到类似的题,即打家劫舍系列里的不能偷相邻的,以及房子围成圆形。

所以问题就转化为——不相邻有限子数列的最大和,该子数列不能同时包含首尾。

即在大小为 3n 的数组中挑选 n 个满足上面条件的数。比如 1~9 披萨时的情况,只能拿走三份。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  idx 1 2 3 4 5 6 7 8 9
case1 -   -   -
case2 -   -       -
case3 -     -   -
case4   -     -   -
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// TODO 代码还有点小问题,需要调调
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 第 22 场双周赛(220/2041,前10.8%)
全国排名:220 / 2041,10.8%;全球排名:729 / 5630,12.9%
Michael阿明
2020/07/13
3410
LeetCode笔记:Weekly Contest 237 比赛记录
久违的参加了一次比赛,结果怎么说呢,一言难尽,4道题算是都做出来了,不过最后一题真的是坑爹,因为完全是一道数学题,如果事先知道他考察的定理那么最后一题的题目就是瞬秒的题目,如果不知道,那么呵呵,goodbye……
codename_cys
2021/04/26
3080
Data Structures and Algorithms Basics(005):Divid conquer
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如二分搜索,排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)......
用户5473628
2019/08/08
5330
2023-10-25:用go语言,假如某公司目前推出了N个在售的金融产品(1<=N<=100) 对于张三,用ai表示他购买了ai
2023-10-25:用go语言,假如某公司目前推出了N个在售的金融产品(1<=N<=100)
福大大架构师每日一题
2023/10/27
2020
2023-10-25:用go语言,假如某公司目前推出了N个在售的金融产品(1<=N<=100) 对于张三,用ai表示他购买了ai
LeetCode(Weekly Contest 188)题解
0. 前言 中文版地址:https://leetcode-cn.com/contest/weekly-contest-188/ 英文版地址:https://leetcode.com/contest/weekly-contest-188/ 1. 题解 1.1 5404. 用栈操作构建数组(1441. Build an Array With Stack Operations) 中文版题目描述:https://leetcode-cn.com/problems/build-an-array-with-stac
西凉风雷
2022/11/23
2180
LeetCode Weekly Contest 21(双周赛)
给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,’e’,’i’,’o’,’u’ ,在子字符串中都恰好出现了偶数次(含 0 次)。
wywwzjj
2023/05/09
1950
组内刷题之LeetCode第188周赛解题思路
题目:给你一个目标数组 target 和一个整数 n。每次迭代,需要从 list = {1,2,3..., n} 中依序读取一个数字。
公众号guangcity
2020/06/09
5170
LeetCode Weekly Contest 181
总感觉周赛越来越水了,也许是题目的数据量比较小,所以不需要什么优化,简单模拟就能做出来。
wywwzjj
2023/05/09
2320
LeetCode Weekly Contest 181
LeetCode Weekly Contest 177
输入:date1 = “2019-06-29”, date2 = “2019-06-30” 输出:1
wywwzjj
2023/05/09
2470
LeetCode Weekly Contest 177
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,
福大大架构师每日一题
2023/12/13
1570
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
leetcode每日一题:数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。
利刃大大
2023/04/12
1730
LeetCode 第 46 场双周赛题解
当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。
宫水三叶的刷题日记
2021/02/26
5310
LeetCode 1868. 两个行程编码数组的积(双指针)
行程编码(Run-length encoding)是一种压缩算法,能让一个含有许多段连续重复数字的整数类型数组 nums 以一个(通常更小的)二维数组 encoded 表示。
Michael阿明
2021/09/06
7060
leetcode31场双周赛
给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。
你的益达
2020/08/05
4330
leetcode31场双周赛
2021-07-30:两个有序数组间相加和的Topk问题。给定两个
2021-07-30:两个有序数组间相加和的Topk问题。给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。按照降序输出。要求时间复杂度为O(klogk)。
福大大架构师每日一题
2021/07/31
3320
2021-07-30:两个有序数组间相加和的Topk问题。给定两个
【Leetcode -561.数组拆分 -566.重塑矩阵】
题目:给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如(a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
YoungMLet
2024/03/01
1460
LeetCode笔记:Weekly Contest 205 比赛记录
1. 题目一 给出题目一的试题链接如下: 1576. 替换所有的问号 1. 解题思路 这一题本身不难,无非就是对每一个?进行一下替换就行了,可惜我在比赛的时候想复杂了,想着可不可能会出现什么因为之前的
codename_cys
2021/03/28
2430
LeetCode 第 34 场双周赛(385/2842,前13.5%)
全国排名: 385 / 2842,13.5%;全球排名: 1149 / 10140,11.3%
Michael阿明
2021/02/19
3170
LeetCode 第 32 场双周赛(983/2957,前33.2%)
全国排名: 983 / 2957,33.2%;全球排名: 2962 / 10463,28.3%
Michael阿明
2021/02/19
3400
LeetCode Weekly Contest 179
生成每种字符都是奇数个的字符串 总感觉这题应该叫我们来验证字符是否全为奇数个,结果反过来了? func generateTheString(n int) string { if n%2 == 1 { return strings.Repeat("w", n) } else { return strings.Repeat("w", n-1) + "y" } } 灯泡开关 III 模拟一下 func numTimesAllBlue(light []int) int
wywwzjj
2023/05/09
1590
推荐阅读
相关推荐
LeetCode 第 22 场双周赛(220/2041,前10.8%)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验