You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- 遍历 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
+
77
79
78
-
具体参考下方代码。
80
+
具体参考下方代码。
79
81
80
82
## 关键点
81
83
82
84
- 反向思考,题目要找最少操作数,其实就是找最多保留多少个数
85
+
- 对于每一个 num 我们需要找到其作为左端点时,那么右端点就是 v + on - 1,于是我们在这个数组中找值在 num 和 v + on - 1 的有多少个,这些都是可以保留的
86
+
- 排序 + 二分 减少时间复杂度
83
87
84
88
## 代码
85
89
@@ -99,8 +103,9 @@ class Solution:
99
103
nums.sort()
100
104
n =len(nums)
101
105
for i, v inenumerate(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 作为右端点
0 commit comments