Skip to content

Commit 4edc8a8

Browse files
committed
to: 添加注释
1 parent 93e0530 commit 4edc8a8

7 files changed

+63
-27
lines changed

src/sort/largest_positive_integer_that_exists_with_its_negative.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66

77
class Solution {
88
public:
9+
// 寻找最大的k,使得-k存在于nums中
910
int findMaxK(vector<int> &nums) {
11+
// 从小到大排序
1012
std::sort(nums.begin(), nums.end());
1113
int max_k = -1;
1214
int i = 0;
1315
int j = nums.size() - 1;
16+
// 双指针寻找最大的k
1417
while (i < j) {
1518
if (nums[i] + nums[j] == 0) {
19+
// 如果i和j的和为0,则说明-k存在于nums中,返回j即可
1620
max_k = nums[j];
1721
break;
1822
} else if (nums[i] + nums[j] < 0) {
23+
// 如果i和j的和小于0,则说明i需要向右移动
1924
i++;
2025
} else {
26+
// 如果i和j的和大于0,则说明j需要向左移动
2127
j--;
2228
}
2329
}

src/sort/largest_values_from_labels.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,40 @@
55

66
class Solution {
77
public:
8+
// 求出从values中选numWanted个数的最大值,其中每个数有对应的标签labels,
9+
// 每个标签最多只能使用useLimit次
810
int largestValsFromLabels(vector<int> &values, vector<int> &labels,
911
int numWanted, int useLimit) {
12+
// 将values和labels组合成pair放到vector中
1013
vector<pair<int, int>> v;
1114
for (int i = 0; i < values.size(); ++i) {
1215
v.push_back({values[i], labels[i]});
1316
}
17+
// 根据values中的大小进行排序
1418
sort(v.begin(), v.end(),
1519
[](const pair<int, int> &a, const pair<int, int> &b) {
1620
return a.first > b.first;
1721
});
22+
// 使用unordered_map记录每个标签已经使用的次数
1823
unordered_map<int, int> m;
1924
int res = 0;
25+
// 遍历排序后的vector
2026
for (int i = 0; i < v.size(); ++i) {
27+
// 如果当前标签还可以使用
2128
if (m[v[i].second] < useLimit) {
29+
// 记录当前选中的数的和
2230
res += v[i].first;
31+
// 将当前标签的使用次数加1
2332
++m[v[i].second];
33+
// 将还需要选的数量减1
2434
--numWanted;
2535
}
36+
// 如果已经选够了numWanted个数,则直接退出循环
2637
if (numWanted == 0) {
2738
break;
2839
}
2940
}
41+
// 返回选中数的和
3042
return res;
3143
}
3244
};

src/sort/make_array_strictly_increasing.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,31 @@ constexpr int INF = 0x3f3f3f3f;
99
class Solution {
1010
public:
1111
int makeArrayIncreasing(vector<int> &arr1, vector<int> &arr2) {
12-
sort(arr2.begin(), arr2.end());
13-
arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end());
12+
sort(arr2.begin(), arr2.end()); // 对 arr2 排序
13+
arr2.erase(unique(arr2.begin(), arr2.end()), arr2.end()); // 去重
1414
int n = arr1.size();
1515
int m = arr2.size();
16-
vector<vector<int>> dp(n + 1, vector<int>(min(m, n) + 1, INF));
17-
dp[0][0] = -1;
16+
vector<vector<int>> dp(n + 1, vector<int>(min(m, n) + 1, INF)); // 定义状态数组
17+
dp[0][0] = -1; // 初始化
1818
for (int i = 1; i <= n; i++) {
1919
for (int j = 0; j <= min(i, m); j++) {
2020
/* 如果当前元素大于序列的最后一个元素 */
2121
if (arr1[i - 1] > dp[i - 1][j]) {
22-
dp[i][j] = arr1[i - 1];
22+
dp[i][j] = arr1[i - 1]; // 直接将当前元素加入序列
2323
}
2424
if (j > 0 && dp[i - 1][j - 1] != INF) {
2525
/* 查找严格大于 dp[i - 1][j - 1] 的最小元素 */
2626
auto it =
2727
upper_bound(arr2.begin() + j - 1, arr2.end(), dp[i - 1][j - 1]);
2828
if (it != arr2.end()) {
29-
dp[i][j] = min(dp[i][j], *it);
29+
dp[i][j] = min(dp[i][j], *it); // 将找到的元素加入序列
3030
}
3131
}
3232
if (i == n && dp[i][j] != INF) {
33-
return j;
33+
return j; // 返回最小的可以使数组严格递增的操作次数
3434
}
3535
}
3636
}
37-
return -1;
37+
return -1; // 无法使数组严格递增
3838
}
3939
};

src/sort/merge_sort.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,40 @@
55
class Solution
66
{
77
public:
8+
// 归并排序函数,返回排序后的数组
89
vector<int> mergeSort(vector<int> &nums)
910
{
11+
// 数组大小小于等于1时直接返回
1012
if (nums.size() <= 1)
1113
return nums;
14+
// 找到数组中间位置
1215
int halfIndex = floor(nums.size() / 2);
16+
// 将左半部分赋值给left
1317
vector<int> left;
1418
left.assign(nums.begin(), nums.begin() + halfIndex);
15-
19+
// 将右半部分赋值给right
1620
vector<int> right;
1721
right.assign(nums.begin() + halfIndex, nums.end());
18-
22+
// 递归调用归并排序函数对左右两部分分别排序
1923
vector<int> leftSort = mergeSort(left);
2024
vector<int> rightSort = mergeSort(right);
25+
// 将排序后的左右两部分合并
2126
return marge(leftSort, rightSort);
2227
}
2328

2429
private:
30+
// 合并两个有序数组为一个有序数组
2531
vector<int> marge(vector<int> &left, vector<int> &right)
2632
{
2733
vector<int> res;
34+
// 当左右两个数组都不为空时
2835
while (left.size() > 0 && right.size() > 0)
2936
{
37+
// 将左右两个数组中较小的元素加入结果数组中
3038
if (left[0] < right[0])
3139
{
3240
res.push_back(left[0]);
41+
// 删除已经加入结果数组的元素
3342
vector<int>::iterator k = left.begin();
3443
left.erase(k);
3544
}
@@ -40,6 +49,7 @@ class Solution
4049
right.erase(j);
4150
}
4251
}
52+
// 将左右两个数组中剩余的元素加入结果数组中
4353
res.insert(res.end(), left.begin(), left.end());
4454
res.insert(res.end(), right.begin(), right.end());
4555
return res;

src/sort/moving_stones_until_consecutive_ii.cpp

+11-10
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,24 @@
66
class Solution {
77
public:
88
vector<int> numMovesStonesII(vector<int> &stones) {
9-
sort(stones.begin(), stones.end());
9+
sort(stones.begin(), stones.end()); // 将石头位置从小到大排序
1010
int n = stones.size();
11-
int maxn = max(stones[n - 1] - n + 2 - stones[1],
12-
stones[n - 2] - stones[0] - n + 2);
13-
int minn = maxn;
14-
int i = 0, j = 0;
11+
// 计算最大值
12+
int maxn = max(stones[n - 1] - n + 2 - stones[1], // 最右边的石头往左移或最左边的石头往右移
13+
stones[n - 2] - stones[0] - n + 2); // 最右边的石头往左移并且最左边的石头往右移
14+
int minn = maxn; // 初始最小值等于最大值
15+
int i = 0, j = 0; // 双指针,i指向区间左端点,j指向区间右端点
1516
while (j < n) {
16-
while (stones[j] - stones[i] + 1 > n) {
17+
while (stones[j] - stones[i] + 1 > n) { // 区间长度大于等于n时缩小区间
1718
i++;
1819
}
19-
if (j - i + 1 == n - 1 && stones[j] - stones[i] + 1 == n - 1) {
20-
minn = min(minn, 2);
20+
if (j - i + 1 == n - 1 && stones[j] - stones[i] + 1 == n - 1) { // 只有一个空位
21+
minn = min(minn, 2); // 只需要移动两次
2122
} else {
22-
minn = min(minn, n - (j - i + 1));
23+
minn = min(minn, n - (j - i + 1)); // 其他情况最小移动次数为n-区间长度
2324
}
2425
j++;
2526
}
26-
return {minn, maxn};
27+
return {minn, maxn}; // 返回最小值和最大值
2728
}
2829
};

src/sort/quick_sort.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,39 @@
55
class Solution
66
{
77
public:
8+
// 对给定数组进行快速排序
89
void quickSort(vector<int> &nums)
910
{
1011
quickSort(nums, 0, nums.size() - 1);
1112
}
1213

1314
private:
15+
// 对数组nums的[l, r]部分进行partition操作,并返回pivot的下标
1416
int partition(vector<int> &nums, int l, int r)
1517
{
18+
// 选择第一个元素作为pivot
1619
int v = nums[l];
1720

21+
// [l+1, j]表示小于v的部分,(j, i]表示大于等于v的部分
1822
int j = l;
1923
for (int i = l + 1; i <= r; ++i)
2024
{
2125
if (nums[i] < v)
22-
swap(nums[i], nums[++j]);
26+
swap(nums[i], nums[++j]); // 将小于v的元素交换到[l+1, j]位置
2327
}
2428

25-
swap(nums[l], nums[j]);
29+
swap(nums[l], nums[j]); // 将pivot交换到正确的位置
2630

2731
return j;
2832
}
2933

34+
// 对数组nums的[l, r]部分进行快速排序
3035
void quickSort(vector<int> &nums, int l, int r)
3136
{
3237
if (l >= r)
3338
return;
34-
int j = partition(nums, l, r);
35-
quickSort(nums, l, j - 1);
36-
quickSort(nums, j + 1, r);
39+
int j = partition(nums, l, r); // 对当前部分进行partition操作,得到pivot的下标
40+
quickSort(nums, l, j - 1); // 对pivot左侧部分进行递归排序
41+
quickSort(nums, j + 1, r); // 对pivot右侧部分进行递归排序
3742
}
3843
};

src/sort/widest_vertical_area_between_two_points_containing_no_points.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
class Solution {
88
public:
99
int maxWidthOfVerticalArea(vector<vector<int>> &points) {
10+
// 将点按照横坐标从小到大排序
1011
sort(points.begin(), points.end());
11-
int maxX = 0;
12+
int maxX = 0; // 最大宽度初始为0
13+
// 遍历每两个相邻的点,计算它们之间的横坐标差,更新最大宽度
1214
for (int i = 1; i < points.size(); i++) {
1315
maxX = max(points[i][0] - points[i - 1][0], maxX);
1416
}
15-
return maxX;
17+
return maxX; // 返回最大宽度
1618
}
1719
};

0 commit comments

Comments
 (0)