力扣第 391 场周赛

A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int sumOfTheDigitsOfHarshadNumber(int x)
{
int i=0;
int m=x;
int count=0;
while(m)
{
count+=m%10;
m/=10;
}
return x%count==0 ? count : -1;
}
};

B

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int maxBottlesDrunk(int numBottles, int numExchange) {
int sum=numBottles;
while(numBottles>=numExchange)
{
numBottles+=1;
numBottles-=numExchange;
numExchange++;
sum+=1;
}
return sum;}
};

C

需要进行双指针,计算最右端的那个下标

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

D

作者:灵茶山艾府

主要知识点就是二维空间中的曼哈顿距离与切比雪夫距离

曼哈顿距离

定义

设平面空间内存在两点,它们的坐标为(𝑥1,𝑦1)(𝑥2,𝑦2)

则𝑑𝑖𝑠=|𝑥1−𝑥2|+|𝑦1−𝑦2|

切比雪夫距离

设平面空间内存在两点,它们的坐标为(𝑥1,𝑦1)(𝑥2,𝑦2)

则𝑑𝑖𝑠=𝑚𝑎𝑥(|𝑥1−𝑥2|,|𝑦1−𝑦2|)

即两点横纵坐标差的最大值

两者之间的关系

两者的定义看上去好像毛线关系都没有,但实际上,这两种距离可以相互转化

我们考虑最简单的情况,在一个二维坐标系中,设原点为(0,0)

如果用曼哈顿距离表示,则与原点距离为1的点会构成一个边长为√2的正方形

如果用切比雪夫距离表示,则与原点距离为1的点会构成一个边长为2的正方形

将一个点\((x,y)\)的坐标变为\((x+y,x-y)\)后,原坐标系中的曼哈顿距离 \(=\) 新坐标系中的切比雪夫距离

将一个点\((x,y)\)的坐标变为\((\frac{x+y}{2},\frac{x-y}{2})\) 后,原坐标系中的切比雪夫距离 \(=\) 新坐标系中的曼哈顿距离

即两点横纵坐标差之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int minimumDistance(vector<vector<int>> &points) {
multiset<int> xs, ys;
for (auto &p : points) {
xs.insert(p[0] + p[1]);
ys.insert(p[1] - p[0]);
}
int ans = INT_MAX;
for (auto &p : points) {
int x = p[0] + p[1], y = p[1] - p[0];
xs.erase(xs.find(x));
ys.erase(ys.find(y));
ans = min(ans, max(*xs.rbegin() - *xs.begin(), *ys.rbegin() - *ys.begin()));
xs.insert(x);
ys.insert(y);
}
return ans;
}
};