Skip to content

Commit 55bd379

Browse files
author
robot
committed
go
1 parent da6de9d commit 55bd379

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
431431
- [2592. 最大化数组的伟大值](./problems/2592.maximize-greatness-of-an-array.md)
432432
- [2593. 标记所有元素后数组的分数](./problems/2593.find-score-of-an-array-after-marking-all-elements.md)
433433
- [2817. 限制条件下元素之间的最小绝对差](./problems/2817.minimum-absolute-difference-between-elements-with-constraint.md)
434+
- [2866. 美丽塔 II](./problems/2866.beautiful-towers-ii.md)
434435
- [5935. 适合打劫银行的日子](./problems/5935.find-good-days-to-rob-the-bank.md)
435436
- [5936. 引爆最多的炸弹](./problems/5936.detonate-the-maximum-bombs.md)
436437
- [5965. 相同元素的间隔之和](./problems/5965.intervals-between-identical-elements.md)

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@
276276
- [2592. 最大化数组的伟大值](./problems/2592.maximize-greatness-of-an-array.md)
277277
- [2593. 标记所有元素后数组的分数](./problems/2593.find-score-of-an-array-after-marking-all-elements.md)
278278
- [2817. 限制条件下元素之间的最小绝对差](./problems/2817.minimum-absolute-difference-between-elements-with-constraint.md)
279+
- [2866. 美丽塔 II](./problems/2866.beautiful-towers-ii.md)
279280
- [5935. 适合打劫银行的日子](./problems/5935.find-good-days-to-rob-the-bank.md)
280281
- [5936. 引爆最多的炸弹](./problems/5936.detonate-the-maximum-bombs.md)
281282
- [5965. 相同元素的间隔之和](./problems/5965.intervals-between-identical-elements.md)

problems/2009.minimum-number-of-operations-to-make-array-continuous.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,24 @@ nums 中 最大 元素与 最小 元素的差等于 nums.length - 1 。
6666

6767
朴素的思路是枚举所有的区间 [a,b] 其中 a 和 b 为区间 [min(nums),max(nums)] 中的两个数。这种思路的时间复杂度是 $O(v^2)$,其中 v 为 nums 的值域。看一下数据范围,很明显会超时。
6868

69-
我们可以先对数组排序,这样就可以二分找答案,使得时间复杂度降低。看下时间复杂度排序的时间是可以允许的,因此这种解决可以 ac
69+
假设我们最终形成的连续区间是 [l, r],那么 nums[i] 一定有一个是在端点的,因为如果都不在端点,变成在端点不会使得答案更差。这样我们可以枚举 nums[i] 作为 l 或者 r,分别判断在这种情况下我们可以保留的数字个数最多是多少
7070

71-
 具体地:
71+
为了减少时间复杂度,我们可以先对数组排序,这样就可以二分找答案,使得时间复杂度降低。看下时间复杂度排序的时间是可以允许的,因此这种解决可以 ac。
72+
73+
具体地:
7274

7375
- 对数组去重
7476
- 对数组排序
75-
- 遍历 nums,对于每一个 num 我们都二分找到最左和最右的**满足值域差小于等于 old_n 的索引**,其中 old_n 为去重前的 nums 长度。简单来说,我们需要找到满足值在 [x,num] 范围的最左 x 和满足值在 [num,y] 范围的最右 y
76-
- 满足两个值域范围的区间我们找到了,那么答案区间长度的最大值,也就是 n - 区间长度中的**最小值**
77+
- 遍历 nums,对于每一个 num 我们需要找到其作为左端点时,那么右端点就是 v + on - 1,于是我们在这个数组中找值在 num 和 v + on - 1 的有多少个,这些都是可以保留的。剩下的我们需要通过替换得到。 num 作为右端点也是同理。这两种我们需要找最优的。所有 i 的最优解就是答案。
78+
7779

78-
具体参考下方代码。
80+
具体参考下方代码。
7981

8082
## 关键点
8183

8284
- 反向思考,题目要找最少操作数,其实就是找最多保留多少个数
85+
- 对于每一个 num 我们需要找到其作为左端点时,那么右端点就是 v + on - 1,于是我们在这个数组中找值在 num 和 v + on - 1 的有多少个,这些都是可以保留的
86+
- 排序 + 二分 减少时间复杂度
8387

8488
## 代码
8589

@@ -99,8 +103,9 @@ class Solution:
99103
nums.sort()
100104
n = len(nums)
101105
for i, v in enumerate(nums):
102-
r = bisect.bisect_right(nums, v + on - 1)
103-
l = bisect.bisect_left(nums, v - on + 1)
106+
# nums[i] 一定有一个是在端点的,如果都不在端点,变成在端点不会使得答案更差
107+
r = bisect.bisect_right(nums, v + on - 1) # 枚举 i 作为左端点
108+
l = bisect.bisect_left(nums, v - on + 1) # 枚举 i 作为右端点
104109
ans = min(ans, n - (r - i), n - (i - l + 1))
105110
return ans + (on - n)
106111

0 commit comments

Comments
 (0)