Skip to content

feat: add solutions to lcof2 problems: No.035,039 #1403

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 44 additions & 21 deletions lcof2/剑指 Offer II 035. 最小时间差/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,18 @@

<!-- 这里可写通用的实现逻辑 -->

我们注意到,时间点最多只有 `24 * 60` 个,因此,当 timePoints 长度超过 `24 * 60`,说明有重复的时间点,提前返回 0。
**方法一:排序**

接下来:
我们注意到,时间点最多只有 $24 \times 60$ 个,因此,当 $timePoints$ 长度超过 $24 \times 60$,说明有重复的时间点,提前返回 $0$。

首先,遍历时间列表,将其转换为“分钟制”列表 `mins`,比如,对于时间点 `13:14`,将其转换为 `13 * 60 + 14`
接下来,我们首先遍历时间列表,将其转换为“分钟制”列表 $mins$,比如,对于时间点 `13:14`,将其转换为 $13 \times 60 + 14$

接着将“分钟制”列表按升序排列,然后将此列表的最小时间 `mins[0]` 加上 `24 * 60` 追加至列表尾部,用于处理最大值、最小值的差值这种特殊情况。
接着将“分钟制”列表按升序排列,然后将此列表的最小时间 $mins[0]$ 加上 $24 \times 60$ 追加至列表尾部,用于处理最大值、最小值的差值这种特殊情况。

最后遍历“分钟制”列表,找出相邻两个时间的最小值即可。

时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为时间点个数。

<!-- tabs:start -->

### **Python3**
Expand All @@ -62,10 +64,7 @@ class Solution:
return 0
mins = sorted(int(t[:2]) * 60 + int(t[3:]) for t in timePoints)
mins.append(mins[0] + 24 * 60)
res = mins[-1]
for i in range(1, len(mins)):
res = min(res, mins[i] - mins[i - 1])
return res
return min(b - a for a, b in pairwise(mins))
```

### **Java**
Expand All @@ -85,11 +84,11 @@ class Solution {
}
Collections.sort(mins);
mins.add(mins.get(0) + 24 * 60);
int res = 24 * 60;
int ans = 1 << 30;
for (int i = 1; i < mins.size(); ++i) {
res = Math.min(res, mins.get(i) - mins.get(i - 1));
ans = Math.min(ans, mins.get(i) - mins.get(i - 1));
}
return res;
return ans;
}
}
```
Expand All @@ -100,17 +99,20 @@ class Solution {
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
if (timePoints.size() > 24 * 60)
if (timePoints.size() > 24 * 60) {
return 0;
}
vector<int> mins;
for (auto t : timePoints)
for (auto& t : timePoints) {
mins.push_back(stoi(t.substr(0, 2)) * 60 + stoi(t.substr(3)));
}
sort(mins.begin(), mins.end());
mins.push_back(mins[0] + 24 * 60);
int res = 24 * 60;
for (int i = 1; i < mins.size(); ++i)
res = min(res, mins[i] - mins[i - 1]);
return res;
int ans = 1 << 30;
for (int i = 1; i < mins.size(); ++i) {
ans = min(ans, mins[i] - mins[i - 1]);
}
return ans;
}
};
```
Expand All @@ -131,11 +133,11 @@ func findMinDifference(timePoints []string) int {
}
sort.Ints(mins)
mins = append(mins, mins[0]+24*60)
res := 24 * 60
for i := 1; i < len(mins); i++ {
res = min(res, mins[i]-mins[i-1])
ans := 1 << 30
for i, x := range mins[1:] {
ans = min(ans, x-mins[i])
}
return res
return ans
}

func min(a, b int) int {
Expand All @@ -146,6 +148,27 @@ func min(a, b int) int {
}
```

### **TypeScript**

```ts
function findMinDifference(timePoints: string[]): number {
if (timePoints.length > 24 * 60) {
return 0;
}
const mins: number[] = timePoints.map(timePoint => {
const [hour, minute] = timePoint.split(':').map(num => parseInt(num));
return hour * 60 + minute;
});
mins.sort((a, b) => a - b);
mins.push(mins[0] + 24 * 60);
let ans = 1 << 30;
for (let i = 1; i < mins.length; ++i) {
ans = Math.min(ans, mins[i] - mins[i - 1]);
}
return ans;
}
```

### **...**

```
Expand Down
33 changes: 18 additions & 15 deletions lcof2/剑指 Offer II 035. 最小时间差/Solution.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
if (timePoints.size() > 24 * 60)
return 0;
vector<int> mins;
for (auto t : timePoints)
mins.push_back(stoi(t.substr(0, 2)) * 60 + stoi(t.substr(3)));
sort(mins.begin(), mins.end());
mins.push_back(mins[0] + 24 * 60);
int res = 24 * 60;
for (int i = 1; i < mins.size(); ++i)
res = min(res, mins[i] - mins[i - 1]);
return res;
}
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
if (timePoints.size() > 24 * 60) {
return 0;
}
vector<int> mins;
for (auto& t : timePoints) {
mins.push_back(stoi(t.substr(0, 2)) * 60 + stoi(t.substr(3)));
}
sort(mins.begin(), mins.end());
mins.push_back(mins[0] + 24 * 60);
int ans = 1 << 30;
for (int i = 1; i < mins.size(); ++i) {
ans = min(ans, mins[i] - mins[i - 1]);
}
return ans;
}
};
8 changes: 4 additions & 4 deletions lcof2/剑指 Offer II 035. 最小时间差/Solution.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ func findMinDifference(timePoints []string) int {
}
sort.Ints(mins)
mins = append(mins, mins[0]+24*60)
res := 24 * 60
for i := 1; i < len(mins); i++ {
res = min(res, mins[i]-mins[i-1])
ans := 1 << 30
for i, x := range mins[1:] {
ans = min(ans, x-mins[i])
}
return res
return ans
}

func min(a, b int) int {
Expand Down
36 changes: 18 additions & 18 deletions lcof2/剑指 Offer II 035. 最小时间差/Solution.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
class Solution {
public int findMinDifference(List<String> timePoints) {
if (timePoints.size() > 24 * 60) {
return 0;
}
List<Integer> mins = new ArrayList<>();
for (String t : timePoints) {
String[] time = t.split(":");
mins.add(Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]));
}
Collections.sort(mins);
mins.add(mins.get(0) + 24 * 60);
int res = 24 * 60;
for (int i = 1; i < mins.size(); ++i) {
res = Math.min(res, mins.get(i) - mins.get(i - 1));
}
return res;
}
class Solution {
public int findMinDifference(List<String> timePoints) {
if (timePoints.size() > 24 * 60) {
return 0;
}
List<Integer> mins = new ArrayList<>();
for (String t : timePoints) {
String[] time = t.split(":");
mins.add(Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]));
}
Collections.sort(mins);
mins.add(mins.get(0) + 24 * 60);
int ans = 1 << 30;
for (int i = 1; i < mins.size(); ++i) {
ans = Math.min(ans, mins.get(i) - mins.get(i - 1));
}
return ans;
}
}
17 changes: 7 additions & 10 deletions lcof2/剑指 Offer II 035. 最小时间差/Solution.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
if len(timePoints) > 24 * 60:
return 0
mins = sorted(int(t[:2]) * 60 + int(t[3:]) for t in timePoints)
mins.append(mins[0] + 24 * 60)
res = mins[-1]
for i in range(1, len(mins)):
res = min(res, mins[i] - mins[i - 1])
return res
class Solution:
def findMinDifference(self, timePoints: List[str]) -> int:
if len(timePoints) > 24 * 60:
return 0
mins = sorted(int(t[:2]) * 60 + int(t[3:]) for t in timePoints)
mins.append(mins[0] + 24 * 60)
return min(b - a for a, b in pairwise(mins))
16 changes: 16 additions & 0 deletions lcof2/剑指 Offer II 035. 最小时间差/Solution.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
function findMinDifference(timePoints: string[]): number {
if (timePoints.length > 24 * 60) {
return 0;
}
const mins: number[] = timePoints.map(timePoint => {
const [hour, minute] = timePoint.split(':').map(num => parseInt(num));
return hour * 60 + minute;
});
mins.sort((a, b) => a - b);
mins.push(mins[0] + 24 * 60);
let ans = 1 << 30;
for (let i = 1; i < mins.length; ++i) {
ans = Math.min(ans, mins[i] - mins[i - 1]);
}
return ans;
}
Loading