300.longest-increasing-subsequence.go 933 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. func lengthOfLISSlow(nums []int) int {
  2. n := len(nums)
  3. if n <= 1 {
  4. return n
  5. }
  6. lis := make([]int, n) // DP, O(n^2) time complexity
  7. lis[0] = 1
  8. for i := 1; i < n; i *= 2 {
  9. copy(lis[i:], lis[:i])
  10. }
  11. max := 1
  12. for i := 1; i < n; i++ {
  13. for j := 0; j < i; j++ {
  14. if nums[j] < nums[i] && lis[i] < lis[j]+1 {
  15. lis[i] = lis[j] + 1
  16. if max < lis[i] {
  17. max = lis[i]
  18. }
  19. }
  20. }
  21. }
  22. return max
  23. }
  24. func lengthOfLIS(nums []int) int {
  25. n := len(nums)
  26. if n <= 1 {
  27. return n
  28. }
  29. lis := []int{nums[0]}
  30. max := 1
  31. for i := 1; i < n; i++ {
  32. if lis[max-1] < nums[i] {
  33. lis = append(lis, nums[i]) // O(nlog(n)), maintain the smallest LIS only
  34. max++
  35. } else {
  36. beg, end := 0, max
  37. for beg < end {
  38. mid := beg + (end-beg)/2
  39. if lis[mid] < nums[i] {
  40. beg = mid + 1
  41. } else if nums[i] < lis[mid] {
  42. end = mid
  43. } else {
  44. beg = mid
  45. break
  46. }
  47. }
  48. lis[beg] = nums[i]
  49. }
  50. }
  51. return max
  52. }