diff --git a/arai60/longest_increasing_subsequence/phase1.py b/arai60/longest_increasing_subsequence/phase1.py new file mode 100644 index 0000000..f079b52 --- /dev/null +++ b/arai60/longest_increasing_subsequence/phase1.py @@ -0,0 +1,8 @@ +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_so_far = [1] * len(nums) # lis: longest increasing subsequence + for i in range(len(nums)-1): + for j in range(i+1, len(nums)): + if nums[i] < nums[j] and lis_so_far[j] < lis_so_far[i] + 1: + lis_so_far[j] = lis_so_far[i] + 1 + return max(lis_so_far) diff --git a/arai60/longest_increasing_subsequence/phase2.py b/arai60/longest_increasing_subsequence/phase2.py new file mode 100644 index 0000000..599f5e7 --- /dev/null +++ b/arai60/longest_increasing_subsequence/phase2.py @@ -0,0 +1,29 @@ +""" +Reference +hayashi-ayさん: https://github.com/hayashi-ay/leetcode/pull/27/files +rossy0213さん: https://github.com/rossy0213/leetcode/pull/15/files +sakupan102さん: https://github.com/sakupan102/arai60-practice/pull/32/files 二分探索のところの議論がためになりました +Exzrgsさん: https://github.com/Exzrgs/LeetCode/pull/18/files + +phase1の方法の動的計画法ではなくすることで最後のmax(lis_so_far)の作業をなくすことにした。 +""" + +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_so_far = [1] * len(nums) # lis: longest increasing subsequence + max_lis = 1 + for i in range(len(nums)): + for j in range(i): + if nums[j] < nums[i]: + lis_so_far[i] = max(lis_so_far[i], lis_so_far[j] + 1) + max_lis = max(max_lis, lis_so_far[i]) + return max_lis + +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + MAX_NUM = 10 ** 4 + increasing_subsequence = [MAX_NUM + 1] * len(nums) + for num in nums: + index = bisect_left(increasing_subsequence, num) + increasing_subsequence[index] = num + return bisect_left(increasing_subsequence, MAX_NUM + 1) diff --git a/arai60/longest_increasing_subsequence/phase3.py b/arai60/longest_increasing_subsequence/phase3.py new file mode 100644 index 0000000..d3c4dbf --- /dev/null +++ b/arai60/longest_increasing_subsequence/phase3.py @@ -0,0 +1,10 @@ +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_so_far = [1] * len(nums) # lis means longest increasing subsequence + max_lis = 1 + for i in range(1, len(nums)): + for j in range(i): + if nums[j] < nums[i]: + lis_so_far[i] = max(lis_so_far[i], lis_so_far[j] + 1) + max_lis = max(lis_so_far[i], max_lis) + return max_lis diff --git a/arai60/longest_increasing_subsequence/phase4.py b/arai60/longest_increasing_subsequence/phase4.py new file mode 100644 index 0000000..4fe51bf --- /dev/null +++ b/arai60/longest_increasing_subsequence/phase4.py @@ -0,0 +1,9 @@ +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_so_far = [1] * len(nums) # lis means longest increasing subsequence + max_lis = 1 + for i in range(1, len(nums)): + for j in range(i): + if nums[j] < nums[i]: + lis_so_far[i] = max(lis_so_far[i], lis_so_far[j] + 1) + return max(lis_so_far) diff --git a/arai60/longest_increasing_subsequence/phase5.py b/arai60/longest_increasing_subsequence/phase5.py new file mode 100644 index 0000000..b41cdd0 --- /dev/null +++ b/arai60/longest_increasing_subsequence/phase5.py @@ -0,0 +1,10 @@ +class Solution: + def lengthOfLIS(self, nums: List[int]) -> int: + lis_so_far = [] + for num in nums: + index = bisect.bisect_left(lis_so_far, num) + if index == len(lis_so_far): + lis_so_far.append(num) + elif index < len(lis_so_far): + lis_so_far[index] = num + return len(lis_so_far)