Skip to content
Open
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
62 changes: 62 additions & 0 deletions Complehensive/252/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# 進め方
- step1: 5分考えて分からなかったら答えを見る。答えを理解したら、答えを隠して書く。筆が進まず5分立ったら答えを見る。答えを送信して正解するまで。
- step2: コードを読みやすく整える。動くコードになったら終了。
- step3: 時間を計りながら書く。10分以内に3回連続でアクセプトされるまで。

# step1: 15分
## 方針を考える
startでソートして、i番目のアイテムのendとi+1番目のアイテムのstartについて、end <= startが成立するか確認すれば解けそう。

O(n)で解ける方法がないか検討したけど思いつかなかった。

## 実装
```python
class Solution:
def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
intervals_sorted_by_start = sorted(intervals, key=lambda interval: interval[0])
for i in range(len(intervals_sorted_by_start) - 1):
if intervals_sorted_by_start[i][1] > intervals_sorted_by_start[i + 1][0]:
return False
return True
```

# step2: 30分
leetcodeの解法を見たら、全組み合わせを確認する解法とソートして確認する解法だった。
Pythonだと空間計算量はO(n)だけど、JavaだとO(logn)とのこと。実装アルゴリズムが異なるらしい。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

何のことかと思ってGeminiに聞いてみたところ

  • PythonはTimsort. 空間計算量は O(n)
  • JavaではDual-Pivot Quicksort. 空間計算量は O(log n)
    • ただし Arrays.sort() でプリミティブ型をソートする場合。そうでない場合はTimsortが使われる

ということなんですね(裏取りできていませんが)。



# step3: 15分
※間違えがあればn回目を増やす

## 1回目
```python
class Solution:
def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
intervals_sorted_by_start = sorted(intervals, key=lambda interval: interval[0])
for i in range(len(intervals_sorted_by_start) - 1):
if intervals_sorted_by_start[i][1] > intervals_sorted_by_start[i + 1][0]:
return False
return True
```

## 2回目
```python
class Solution:
def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
intervals_sorted_by_started = sorted(intervals, key=lambda interval: interval[0])
for i in range(len(intervals_sorted_by_started) - 1):
if intervals_sorted_by_started[i][1] > intervals_sorted_by_started[i + 1][0]:
return False
return True
```

## 3回目
```python
class Solution:
def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
intervals_sorted_by_start = sorted(intervals, key=lambda interval: interval[0])
for i in range(len(intervals_sorted_by_start) - 1):
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

itertools.pairwise を使うと分かりやすく書けます。趣味の範囲だと思います。

if intervals_sorted_by_start[i][1] > intervals_sorted_by_start[i + 1][0]:
return False
return True
```