[LeetCode] Maximize Fixed Points After Deletions

3920. Maximize Fixed Points After Deletions

You are given an integer array nums.

A position i is called a fixed point if nums[i] == i.

You are allowed to delete any number of elements (including zero) from the array. After each deletion, the remaining elements shift left, and indices are reassigned starting from 0.

Return an integer denoting the maximum number of fixed points that can be achieved after performing any number of deletions.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
struct Seg {
int l, r, ma;
Seg *left, *right;
Seg(int le, int ri) : l(le), r(ri), ma(0), left(nullptr), right(nullptr) {
if(l ^ r) {
int m = l + (r - l) / 2;
left = new Seg(l,m);
right = new Seg(m+1,r);
}
}
void update(int n, int x) {
if(l <= n and n <= r) {
ma = max(ma, x);
if(left) left->update(n,x);
if(right) right->update(n,x);
}
}
int query(int le, int ri) {
if(le <= l and r <= ri) return ma;
if(l > ri or r < le) return 0;
return max(left->query(le,ri), right->query(le,ri));
}
};
class Solution {
public:
int maxFixedPoints(vector<int>& nums) {
int ma = *max_element(begin(nums), end(nums));
vector<vector<int>> groups(ma + 1);
for (int i = 0; i < nums.size(); i++) {
if (nums[i] <= i) {
groups[nums[i]].push_back(i - nums[i]);
}
}

Seg* seg = new Seg(0, nums.size());
int res = 0;

for (int v = 0; v <= ma; v++) {
vector<pair<int,int>> upd;
for (int d : groups[v]) {
int now = seg->query(0, d) + 1;
upd.push_back({d, now});
res = max(res, now);
}
for (auto& [d, now] : upd) {
seg->update(d, now);
}
}

return res;
}
};
Author: Song Hayoung
Link: https://songhayoung.github.io/2026/09/04/PS/LeetCode/maximize-fixed-points-after-deletions/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.