3285_找到稳定山的下标

力扣链接:3285. 找到稳定山的下标 力扣难度 简单 算法评级: 1 无算法要求 难度分 1166 有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我们称它是 稳定 的。我们定义下标为 0 的山 不是 稳定的。 请你返回一个数组,包含所有 稳定 山的下标,你可以以 任意 顺序返回下标数组。 示例 1: 输入:height = [1,2,3,4,5], threshold = 2 输出:[3,4] 解释: 下标为 3 的山是稳定的,因为 height[2] == 3 大于 threshold == 2 。 下标为 4 的山是稳定的,因为 height[3] == 4 大于 threshold == 2. 示例 2: ...

十二月 25, 2024

1387_将整数按权重排序

力扣链接:1387. 将整数按权重排序 力扣难度 中等 算法评级: 6 深入理解并灵活应用数据结构和算法,理解高级数据结构 难度分 1507 题目: 我们将整数 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 个整数有 相同 的权重,那么按照数字自身的数值 升序排序 。 ...

十二月 22, 2024

2545_根据第K场考试的分数排序

力扣链接:2545. 根据第 K 场考试的分数排序 力扣难度 中等 算法评级: 3 理解常用数据结构和算法 难度分 1294 题目: 班里有 m 位学生,共计划组织 n 场考试。给你一个下标从 0 开始、大小为 m x n 的整数矩阵 score ,其中每一行对应一位学生,而 score[i][j] 表示第 i 位学生在第 j 场考试取得的分数。矩阵 score 包含的整数 互不相同 。 另给你一个整数 k 。请你按第 k 场考试分数从高到低完成对这些学生(矩阵中的行)的排序。 返回排序后的矩阵。 示例 1: 输入:score = [[10,6,9,1],[7,5,11,2],[4,8,3,15]], k = 2 输出:[[7,5,11,2],[10,6,9,1],[4,8,3,15]] 解释:在上图中,S 表示学生,E 表示考试。 下标为 1 的学生在第 2 场考试取得的分数为 11 ,这是考试的最高分,所以 TA 需要排在第一。 下标为 0 的学生在第 2 场考试取得的分数为 9 ,这是考试的第二高分,所以 TA 需要排在第二。 下标为 2 的学生在第 2 场考试取得的分数为 3 ,这是考试的最低分,所以 TA 需要排在第三。 示例 2: ...

十二月 21, 2024

3138_同位字符串连接的最小长度

力扣链接:3138. 同位字符串连接的最小长度 力扣难度 中等 算法评级: 5 熟练掌握常用数据结构和算法,初步了解高级数据结构 难度分 1979 题目: 给你一个字符串 s ,它由某个字符串 t 和若干 t 的 同位字符串 连接而成。 请你返回字符串 t 的 最小 可能长度。 同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。 示例 1: 输入:s = “abba” 输出:2 解释: 一个可能的字符串 t 为 “ba” 。 示例 2: 输入:s = “cdef” 输出:4 解释: 一个可能的字符串 t 为 “cdef” ,注意 t 可能等于 s 。 提示: 1 <= s.length <= 105 s 只包含小写英文字母。 func minAnagramLength(s string) int { } 🧠思路: 👈点击 枚举 设 s字符串的长度为n,阅读题目可得提供的s一定是由 字符串 t构成的。(有确定的结) ...

十二月 20, 2024

3291_形成目标字符串需要的最少字符串数_I

力扣链接:3291. 形成目标字符串需要的最少字符串数 I 力扣难度 中等 算法评级: 6 深入理解并灵活应用数据结构和算法,理解高级数据结构 难度分 2082 题目: 给你一个字符串数组 words 和一个字符串 target。 如果字符串 x 是 words 中 任意 字符串的 前缀 ,则认为 x 是一个 有效 字符串。 现计划通过 连接 有效字符串形成 target ,请你计算并返回需要连接的 最少 字符串数量。如果无法通过这种方式形成 target,则返回 -1。 示例 1: 输入: words = [“abc”,“aaaaa”,“bcdef”], target = “aabcdabc” 输出: 3 解释: target 字符串可以通过连接以下有效字符串形成: words[1] 的长度为 2 的前缀,即 “aa”。 words[2] 的长度为 3 的前缀,即 “bcd”。 words[0] 的长度为 3 的前缀,即 “abc”。 示例 2: 输入: words = [“abababab”,“ab”], target = “ababaababa” ...

十二月 17, 2024

1847_最近的房间

力扣链接:1847. 最近的房间 力扣难度 困难 算法评级: 8 掌握不同的数据结构与算法之间的关联性,处理复杂问题,掌握高级数据结构 难度分 2082 题目: 一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i] = [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。 同时给你 k 个查询,用二维数组 queries 表示,其中 queries[j] = [preferredj, minSizej] 。第 j 个查询的答案是满足如下条件的房间 id : 房间的面积 至少 为 minSizej ,且abs(id - preferredj) 的值 最小 ,其中 abs(x) 是 x 的绝对值。 如果差的绝对值有 相等 的,选择 最小 的 id 。如果 没有满足条件的房间 ,答案为 -1 。 请你返回长度为 k 的数组 answer ,其中 answer[j] 为第 j 个查询的结果。 ...

十二月 16, 2024

1338_数组大小减半

力扣链接:1338. 数组大小减半 力扣难度 中等 算法评级: 3 理解常用数据结构和算法 难度分 1303 题目: 给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。 返回 至少 能删除数组中的一半整数的整数集合的最小大小 示例 1: 输入:arr = [3,3,3,3,5,5,5,2,2,7] 输出:2 解释:选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5(原数组长度的一半)。 大小为 2 的可行集合有 {3,5},{3,2},{5,2}。 选择 {2,7} 是不可行的,它的结果数组为 [3,3,3,3,5,5,5],新数组长度大于原数组的二分之一。 示例 2: 输入:arr = [7,7,7,7,7,7] 输出:1 解释:我们只能选择集合 {7},结果数组为空。 提示: 1 <= arr.length <= 105 arr.length 为偶数 1 <= arr[i] <= 105 func minSetSize(arr []int) int { } 🧠思路: 👈点击 猜想 贪心的想法,先遍历一遍记录出现次数。从频率最高的开始删除 问题就变为了怎么记录次数后从大到小排序方便 🔑 答案解析: 👈点击 type pair struct{ x, c int } // 值 和 次数 type hp []pair func (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { // 如果h[i]<h[j]生成的就是小根堆,如果h[i]>h[j]生成的就是大根堆 return h[i].c > h[j].c // 大顶堆 } func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp) Push(x any) { *h = append(*h, x.(pair)) } func (h *hp) Pop() any { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x } func minSetSize(arr []int) int { n := len(arr) CountMap := make(map[int]int) for _, v := range arr { CountMap[v]++ } var h hp = make(hp, 0, len(CountMap)) for x, c := range CountMap { h = append(h, pair{x, c}) } heap.Init(&h) // 堆初始化 ans := 0 for i := 0; i < n/2; { p := heap.Pop(&h).(pair) ans++ i += p.c } return ans }

十二月 15, 2024

3266_K_次乘运算后的最终数组_II

力扣链接:3264. K 次乘运算后的最终数组 I 力扣难度 困难 算法评级: 8 掌握不同的数据结构与算法之间的关联性,处理复杂问题,掌握高级数据结构 难度分 2509 题目: 给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作,每次操作中: 找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个 将 x 替换为 x * multiplier 。 k 次操作以后,你需要将 nums 中每一个数值对 109 + 7 取余。 请你返回执行完 k 次乘运算以及取余运算之后,最终的 nums 数组。 示例 1: 输入:nums = [2,1,3,5,6], k = 5, multiplier = 2 输出:[8,4,6,5,6] 解释: 操作 结果 1 次操作后 [2, 2, 3, 5, 6] 2 次操作后 [4, 2, 3, 5, 6] 3 次操作后 [4, 4, 3, 5, 6] 4 次操作后 [4, 4, 6, 5, 6] 5 次操作后 [8, 4, 6, 5, 6] 示例 2: ...

十二月 14, 2024

3264_K_次乘运算后的最终数组_I

力扣链接:3264. K 次乘运算后的最终数组 I 力扣难度 简单 算法评级: 3 理解常用数据结构和算法 难度分 1178 题目: 给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作,每次操作中: 找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最 前面 的一个。 将 x 替换为 x * multiplier 。 请你返回执行完 k 次乘运算之后,最终的 nums 数组。 示例 1: 输入:nums = [2,1,3,5,6], k = 5, multiplier = 2 输出:[8,4,6,5,6] 解释: 操作 结果 1 次操作后 [2, 2, 3, 5, 6] 2 次操作后 [4, 2, 3, 5, 6] 3 次操作后 [4, 4, 3, 5, 6] 4 次操作后 [4, 4, 6, 5, 6] 5 次操作后 [8, 4, 6, 5, 6] 示例 2: ...

十二月 13, 2024

2931_购买物品的最大开销

力扣链接:2931. 购买物品的最大开销 力扣难度 困难 算法评级: 6 难度分 1822 题目: 给你一个下标从 0 开始大小为 m n 的整数矩阵 values ,表示 m 个不同商店里 m n 件不同的物品。每个商店有 n 件物品,第 i 个商店的第 j 件物品的价值为 values[i][j] 。除此以外,第 i 个商店的物品已经按照价值非递增排好序了,也就是说对于所有 0 <= j < n - 1 都有 values[i][j] >= values[i][j + 1] 。 每一天,你可以在一个商店里购买一件物品。具体来说,在第 d 天,你可以: 选择商店 i 。 购买数组中最右边的物品 j ,开销为 values[i][j] d 。换句话说,选择该商店中还没购买过的物品中最大的下标 j ,并且花费 values[i][j] d 去购买。 注意,所有物品都视为不同的物品。比方说如果你已经从商店 1 购买了物品 0 ,你还可以在别的商店里购买其他商店的物品 0 。 请你返回购买所有 m * n 件物品需要的 最大开销 。 ...

十二月 12, 2024