| 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}
 |