0%

3041. 修改数组后最大化数组中的连续元素数目

3041.修改数组后最大化数组中的连续元素数目

题目描述:

给你一个下标从 0 开始只包含 整数的数组 nums

一开始,你可以将数组中 任意数量 元素增加 至多 1

修改后,你可以从最终数组中选择 一个或者更多 元素,并确保这些元素升序排序后是 连续 的。比方说,[3, 4, 5] 是连续的,但是 [3, 4, 6][1, 1, 2, 3] 不是连续的。

请你返回 最多 可以选出的元素数目。

数据范围:

$1\le nums.len \le 10^5, 1\le nums[i] \le 10^6$

题解:

首先先排序,然后直接使用 $dp$ ,针对每一个数组选择修改与否。如果存在 $dp[x]$ ,则可以选择修改当前 $x$ , $dp[x +1] = dp[x] + 1$ ,否则的话可以考虑接到 $dp[x - 1]$ 后面, $dp[x] = dp[x - 1] + 1$ 。如果使用 $count$ 判断的话需要注意初始状态。

也可以不使用 $count$ ,直接使用 $dp[x +1] = dp[x] + 1, dp[x] = dp[x - 1] + 1$ 。因为如果 $x$ 不存在, $mp[x] = 0$ 。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const static long long mod = 1e9 + 7;
const long long INF_LL = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
int maxSelectedElements(vector<int> &nums)
{
int n = nums.size();
sort(nums.begin(), nums.end());
unordered_map<int, int> mp;
for (int i = 0; i < n; ++i)
{
int x = nums[i];
if (mp.count(x))
mp[x + 1] = max(mp[x + 1], mp[x] + 1);
else mp[x] = mp[x + 1] = 1;
if (mp.count(x - 1))
mp[x] = max(mp[x], mp[x - 1] + 1);
else mp[x] = 1;
}
int ans = 0;
for (auto &[key, val] : mp)
{
ans = max(ans, val);
}
return ans;
}
};