Skip to content

Commit

Permalink
更新题解列表
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Dec 8, 2023
1 parent 6b0bbbe commit 9f3fb25
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Solutions/0001. 两数之和.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
### 思路 1:枚举算法

1. 使用两重循环枚举数组中每一个数 $nums[i]$、$nums[j]$,判断所有的 $nums[i] + nums[j]$ 是否等于 $target$。
2. 如果出现 $nums[i] + nums[j] == target$,则说明数组中存在和为 $target$ 的两个整数,将两个整数的下标 $i$、$$j$ 输出即可。
2. 如果出现 $nums[i] + nums[j] == target$,则说明数组中存在和为 $target$ 的两个整数,将两个整数的下标 $i$、$j$ 输出即可。

### 思路 1:代码

Expand Down
40 changes: 27 additions & 13 deletions Solutions/1450. 在既定时间做作业的学生人数.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

## 题目大意

**描述**:给你两个长度相等的整数数组,一个表示开始时间的数组 `startTime` ,另一个表示结束时间的数组 `endTime`。再给定一个整数 `queryTime` 作为查询时间。已知第 `i` 名学生在 `startTime[i]` 时开始写作业并于 `endTime[i]` 时完成作业。
**描述**:给你两个长度相等的整数数组,一个表示开始时间的数组 $startTime$ ,另一个表示结束时间的数组 $endTime$。再给定一个整数 $queryTime$ 作为查询时间。已知第 $i$ 名学生在 $startTime[i]$ 时开始写作业并于 $endTime[i]$ 时完成作业。

**要求**:返回在查询时间 `queryTime` 时正在做作业的学生人数。即能够使 `queryTime` 处于区间 `[startTime[i], endTime[i]]` 的学生人数。
**要求**:返回在查询时间 $queryTime$ 时正在做作业的学生人数。即能够使 $queryTime$ 处于区间 $[startTime[i], endTime[i]]$ 的学生人数。

**说明**

Expand All @@ -30,9 +30,9 @@

### 思路 1:枚举算法

- 维护一个用于统计在查询时间 `queryTime` 时正在做作业的学生人数的变量 `cnt`。然后遍历所有学生的开始时间和结束时间。
- 如果 `queryTime` 在区间 `[startTime[i], endTime[i]]` 之间,即 `startTime[i] <= queryTime <= endTime[i]`,则令 `cnt``1`
- 遍历完输出统计人数 `cnt`
- 维护一个用于统计在查询时间 $queryTime$ 时正在做作业的学生人数的变量 $cnt$。然后遍历所有学生的开始时间和结束时间。
- 如果 $queryTime$ 在区间 $[startTime[i], endTime[i]]$ 之间,即 $startTime[i] <= queryTime <= endTime[i]$,则令 $cnt$$1$
- 遍历完输出统计人数 $cnt$

### 思路 1:枚举算法代码

Expand All @@ -47,11 +47,16 @@ class Solution:
return cnt
```

### 思路 1:复杂度分析

- **时间复杂度**:$O(n)$,其中 $n$ 为数组中的元素个数。
- **空间复杂度**:$O(1)$。

### 思路 2:线段树

- 因为 $1 \le startTime[i] \le endTime[i] \le 1000$,所以我们可以维护一个区间为 `[0, 1000]` 的线段树,初始化所有区间值都为 `0`
- 然后遍历所有学生的开始时间和结束时间,并将区间 `[startTime[i], endTime[i]]` 值加 `1`
- 在线段树中查询 `queryTime` 对应的单点区间 `[queryTime, queryTime]` 的最大值为多少。
- 因为 $1 \le startTime[i] \le endTime[i] \le 1000$,所以我们可以维护一个区间为 $[0, 1000]$ 的线段树,初始化所有区间值都为 $0$
- 然后遍历所有学生的开始时间和结束时间,并将区间 $[startTime[i], endTime[i]]$ 值加 $1$
- 在线段树中查询 $queryTime$ 对应的单点区间 $[queryTime, queryTime]$ 的最大值为多少。

### 思路 2:线段树代码

Expand Down Expand Up @@ -228,14 +233,19 @@ class Solution:
return self.STree.query_interval(queryTime, queryTime)
```

### 思路 2:复杂度分析

- **时间复杂度**:$O(n \times \log n)$,其中 $n$ 为数组元素的个数。
- **空间复杂度**:$O(n)$。

### 思路 3:树状数组

- 因为 $1 \le startTime[i] \le endTime[i] \le 1000$,所以我们可以维护一个区间为 `[0, 1000]` 的树状数组。
- 因为 $1 \le startTime[i] \le endTime[i] \le 1000$,所以我们可以维护一个区间为 $[0, 1000]$ 的树状数组。
- 注意:
- 树状数组中 `update(self, index, delta):` 指的是将对应元素 `nums[index] ` 加上 `delta`
- `query(self, index):` 指的是 `index` 位置之前的元素和,即前缀和。
- 然后遍历所有学生的开始时间和结束时间,将树状数组上 `startTime[i]` 的值增加 `1`,再将树状数组上`endTime[i]` 的值减少 `1`
- 则查询 `queryTime` 位置的前缀和即为答案。
- 树状数组中 $update(self, index, delta):$ 指的是将对应元素 $nums[index] $ 加上 $delta$
- $query(self, index):$ 指的是 $index$ 位置之前的元素和,即前缀和。
- 然后遍历所有学生的开始时间和结束时间,将树状数组上 $startTime[i]$ 的值增加 $1$,再将树状数组上$endTime[i]$ 的值减少 $1$
- 则查询 $queryTime$ 位置的前缀和即为答案。

### 思路 3:树状数组代码

Expand Down Expand Up @@ -271,3 +281,7 @@ class Solution:
return bit.query(queryTime)
```

### 思路 3:复杂度分析

- **时间复杂度**:$O(n \times \log n)$,其中 $n$ 为数组元素的个数。
- **空间复杂度**:$O(n)$。

0 comments on commit 9f3fb25

Please sign in to comment.