img

力扣第402场周赛

A

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int countCompleteDayPairs(vector<int>& hours) {
int n = hours.size(), ans = 0;
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if((hours[i] + hours[j]) % 24 == 0) ans++;
}
}
return ans;
}
};

B

直接用哈希:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
long long countCompleteDayPairs(vector<int>& hours) {
vector<int> res(24);
long long total = 0;
for(int i:hours)
{
if(i % 24 == 0)
{
total += res[0];
}
else
{
total += res[24-(i%24)];
}
res[i%24] += 1;
}
return total;
}
};

C

先进行一个映射,然后进行dp。因为选择一个物品,贪心的想每一个物品都要选,然后下一个物品要大于2才能转移,直接使用双指针进行移动就可以了。

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
class Solution {
public:
long long maximumTotalDamage(vector<int>& power)
{
unordered_map<int, int> mp;
for (int x : power)
{
mp[x]++;
}
vector<pair<int, int>> cnt(mp.begin(), mp.end());
int n = cnt.size();
sort(cnt.begin(), cnt.end());
vector<long long> dp(n + 1);

dp[1] =
(long long)cnt[0].first * cnt[0].second;
for (int i = 2, j = 0; i <= n; i++)
{
int x = cnt[i - 1].first;
int c = cnt[i - 1].second;

while (cnt[j].first < x - 2)
{
j++;
}

dp[i] = max(dp[i - 1],
dp[j] + (long long)x * c);
}
return dp[n];
}
};

D

用树状数组进行维护:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
const int N = 1e5+10;
int arr[N];
class Solution {
public:
int lowbit(int x)
{
return x&-x;
}
void add(int x,int val,int n)
{
while(x<=n)
{
arr[x] += val;
x += lowbit(x);
}
}
int query(int x)
{
int res = 0;
while(x)
{
res += arr[x];
x -= lowbit(x);
}
return res;

}
vector<int> countOfPeaks(vector<int>& nums, vector<vector<int>>& queries) {
int n = nums.size();
vector<int> ans;
memset(arr,0,sizeof arr);
for(int i=1;i<n-1;i++)
{
if(nums[i]>nums[i-1] && nums[i]>nums[i+1])
{
add(i+1,1,n);
}
}
for(auto &q:queries)
{
if(q[0] == 1)
{
int l = q[1]+1 , r = q[2]+1;
if(r-1<=l) ans.push_back(0);
else ans.push_back(query(r-1) - query(l));
}
else
{
int idx = q[1] , val = q[2];
if(val == nums[idx]) continue;
if(idx-1>0)
{
if(nums[idx-1]>nums[idx-2] && nums[idx-1]>nums[idx])
{
if(val >= nums[idx-1])
{
add(idx-1+1,-1,n);
}
}
if(nums[idx-1]>nums[idx-2] && nums[idx-1]<=nums[idx])
{
if(val < nums[idx-1])
{
add(idx-1+1,1,n);
}
}
}
if(idx < n-2)
{
if(nums[idx+1]>nums[idx] && nums[idx+1]>nums[idx+2])
{
if(val >= nums[idx+1])
{
add(idx+1+1,-1,n);
}
}
if(nums[idx+1]<=nums[idx] && nums[idx+1]>nums[idx+2])
{
if(val < nums[idx+1])
{
add(idx+1+1,1,n);
}
}
}
if(idx == 0 || idx == n-1)
{
nums[idx] = val;
continue;
}
if(nums[idx]>nums[idx-1] && nums[idx]>nums[idx+1])
{
if(val<=nums[idx-1] || val<=nums[idx+1])
{
add(idx+1,-1,n);
}
}
if(nums[idx]<=nums[idx-1] || nums[idx]<=nums[idx+1])
{
if(val>nums[idx-1] && val>nums[idx+1])
{
add(idx+1,1,n);
}
}
nums[idx] = val;
}
}
return ans;
}
};