| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- func lengthOfLISSlow(nums []int) int {
 
- 	n := len(nums)
 
- 	if n <= 1 {
 
- 		return n
 
- 	}
 
- 	lis := make([]int, n) // DP, O(n^2) time complexity
 
- 	lis[0] = 1
 
- 	for i := 1; i < n; i *= 2 {
 
- 		copy(lis[i:], lis[:i])
 
- 	}
 
- 	max := 1
 
- 	for i := 1; i < n; i++ {
 
- 		for j := 0; j < i; j++ {
 
- 			if nums[j] < nums[i] && lis[i] < lis[j]+1 {
 
- 				lis[i] = lis[j] + 1
 
- 				if max < lis[i] {
 
- 					max = lis[i]
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	return max
 
- }
 
- func lengthOfLIS(nums []int) int {
 
- 	n := len(nums)
 
- 	if n <= 1 {
 
- 		return n
 
- 	}
 
- 	lis := []int{nums[0]}
 
- 	max := 1
 
- 	for i := 1; i < n; i++ {
 
- 		if lis[max-1] < nums[i] {
 
- 			lis = append(lis, nums[i]) // O(nlog(n)), maintain the smallest LIS only
 
- 			max++
 
- 		} else {
 
- 			beg, end := 0, max
 
- 			for beg < end {
 
- 				mid := beg + (end-beg)/2
 
- 				if lis[mid] < nums[i] {
 
- 					beg = mid + 1
 
- 				} else if nums[i] < lis[mid] {
 
- 					end = mid
 
- 				} else {
 
- 					beg = mid
 
- 					break
 
- 				}
 
- 			}
 
- 			lis[beg] = nums[i]
 
- 		}
 
- 	}
 
- 	return max
 
- }
 
 
  |