Solved Arai60/300. Longest Increasing Subsequence#31
Conversation
| begin = middle + 1 | ||
| return begin | ||
|
|
||
| subseq_lens_to_nums: list[int] = [] |
| subseq_lens_to_nums: list[int] = [] | ||
| for num in nums: | ||
| insert_pos = get_subseq_len_to_num(subseq_lens_to_nums, num) | ||
| if insert_pos < len(subseq_lens_to_nums): |
There was a problem hiding this comment.
収まっている or 収まっていないで、それぞれ1つ処理があるだけの単純な構造なので、if-elseでも理解しやすいかと思いました。
| end = len(sorted_list) | ||
| while begin != end: | ||
| middle = (begin + end) // 2 | ||
| if num <= sorted_list[middle]: |
There was a problem hiding this comment.
middleが主役の分岐だと思うので、if sorted_list[middle] >= numの方が自然なように感じました。
There was a problem hiding this comment.
主役 (比較される側) を左辺に持ってくる派と、数直線上に一直線に並ぶよう < または <= で原則統一する派があるように思います。
| max_length = 0 | ||
| for i in range(len(nums)): | ||
| longest_subsequence_to_index[i] = 1 | ||
| for j in range(i): |
There was a problem hiding this comment.
i -> end_index
j -> check_index
とかですかね
| ```python | ||
| class Solution: | ||
| def lengthOfLIS(self, nums: List[int]) -> int: | ||
| subsequence_lengths_to_nums: list[int] = [] |
There was a problem hiding this comment.
to_numsは、何かマッピングを行なっているわけではなければ不要かと感じました。
There was a problem hiding this comment.
部分配列の長さから、その部分配列の最後の num のうち最小のものへのマッピングとみなせるため、 subsequence_lengths_to_nums で良いと思います。自分なら、 length_to_min_last_num と付けると思います。
| def lengthOfLIS(self, nums: List[int]) -> int: | ||
| subsequence_lengths_to_nums: list[int] = [] | ||
| for num in nums: | ||
| if not subsequence_lengths_to_nums or subsequence_lengths_to_nums[-1] < num: |
There was a problem hiding this comment.
ここ少し、if分岐がパズルに感じたため、
subsequence_lengths_to_numsの初期値をnums[0]を入れてしまって、特別扱いしても良いかな、と思いました。好みだと思います。
There was a problem hiding this comment.
subsequence_length = bisect_left(subsequence_lengths_to_nums, num)
if subsequence_length == len(subsequence_lengths_to_nums):
subsequence_lengths_to_nums.append(num)
else:
subsequence_lengths_to_nums[subsequence_length] = numとしたほうがシンプルだと思いました。
| ```python | ||
| class Solution: | ||
| def lengthOfLIS(self, nums: List[int]) -> int: | ||
| longest_subsequence_to_index: dict[int, int] = {} |
There was a problem hiding this comment.
キーは配列のインデックスで、値はその要素を最後に使って作れる最大の長さだと思います。 longest_subsequence_to_index という変数名ですと、中に含まれている値と矛盾するように思います。 index_to_max_length はいかがでしょうか?
| ```python | ||
| class Solution: | ||
| def lengthOfLIS(self, nums: List[int]) -> int: | ||
| subsequence_lengths_to_nums: list[int] = [] |
There was a problem hiding this comment.
部分配列の長さから、その部分配列の最後の num のうち最小のものへのマッピングとみなせるため、 subsequence_lengths_to_nums で良いと思います。自分なら、 length_to_min_last_num と付けると思います。
| def lengthOfLIS(self, nums: List[int]) -> int: | ||
| subsequence_lengths_to_nums: list[int] = [] | ||
| for num in nums: | ||
| if not subsequence_lengths_to_nums or subsequence_lengths_to_nums[-1] < num: |
There was a problem hiding this comment.
subsequence_length = bisect_left(subsequence_lengths_to_nums, num)
if subsequence_length == len(subsequence_lengths_to_nums):
subsequence_lengths_to_nums.append(num)
else:
subsequence_lengths_to_nums[subsequence_length] = numとしたほうがシンプルだと思いました。
| end = len(sorted_list) | ||
| while begin != end: | ||
| middle = (begin + end) // 2 | ||
| if num <= sorted_list[middle]: |
There was a problem hiding this comment.
主役 (比較される側) を左辺に持ってくる派と、数直線上に一直線に並ぶよう < または <= で原則統一する派があるように思います。
問題文:https://leetcode.com/problems/longest-increasing-subsequence/