leetcode1964_go_找出到每个位置为止最长的有效障碍赛跑路线

题目

你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obstacles ,数组长度为 n ,

其中 obstacles[i] 表示第 i 个障碍的高度。

对于每个介于 0 和 n - 1 之间(包含 0 和 n - 1)的下标 i ,在满足下述条件的前提下,

请你找出 obstacles 能构成的最长障碍路线的长度:

你可以选择下标介于 0 到 i 之间(包含 0 和 i)的任意个障碍。

在这条路线中,必须包含第 i 个障碍。

你必须按障碍在 obstacles 中的 出现顺序 布置这些障碍。

除第一个障碍外,路线中每个障碍的高度都必须和前一个障碍 相同 或者 更高 。

返回长度为 n 的答案数组 ans ,其中 ans[i] 是上面所述的下标 i 对应的最长障碍赛跑路线的长度。

示例 1:输入:obstacles = [1,2,3,2] 输出:[1,2,3,3]

解释:每个位置的最长有效障碍路线是:

- i = 0: [1], [1] 长度为 1

- i = 1: [1,2], [1,2] 长度为 2

- i = 2: [1,2,3], [1,2,3] 长度为 3

- i = 3: [1,2,3,2], [1,2,2] 长度为 3

示例 2:输入:obstacles = [2,2,1] 输出:[1,2,1]

解释:每个位置的最长有效障碍路线是:

- i = 0: [2], [2] 长度为 1

- i = 1: [2,2], [2,2] 长度为 2

- i = 2: [2,2,1], [1] 长度为 1

示例 3:输入:obstacles = [3,1,5,6,4,2] 输出:[1,1,2,3,2,2]

解释:每个位置的最长有效障碍路线是:

- i = 0: [3], [3] 长度为 1

- i = 1: [3,1], [1] 长度为 1

- i = 2: [3,1,5], [3,5] 长度为 2, [1,5] 也是有效的障碍赛跑路线

- i = 3: [3,1,5,6], [3,5,6] 长度为 3, [1,5,6] 也是有效的障碍赛跑路线

- i = 4: [3,1,5,6,4], [3,4] 长度为 2, [1,4] 也是有效的障碍赛跑路线

- i = 5: [3,1,5,6,4,2], [1,2] 长度为 2

提示:n == obstacles.length

1 <= n <= 105

1 <= obstacles[i] <= 107

解题思路分析

1、动态规划+二分查找;时间复杂度O(nlog(n)),空间复杂度O(n)

leetcode1964_go_找出到每个位置为止最长的有效障碍赛跑路线

func longestObstacleCourseAtEachPosition(obstacles []int) []int {
   n := len(obstacles)
   res := make([]int, n)
   for i := 0; i < n; i++ {
      res[i] = 1
   }
   dp := make([]int, 0)
   dp = append(dp, obstacles[0])
   for i := 1; i < n; i++ {
      if dp[len(dp)-1] <= obstacles[i] {
         dp = append(dp, obstacles[i])
         res[i] = len(dp)
      } else {
         left, right := 0, len(dp)-1
         index := 0
         for left <= right {
            mid := left + (right-left)/2
            if dp[mid] <= obstacles[i] {
               left = mid + 1
            } else {
               index = mid
               right = mid - 1
            }
         }
         dp[index] = obstacles[i] // 替换为当前元素
         res[i] = index + 1
      }
   }
   return res
}

2、动态规划+二分查找;时间复杂度O(nlog(n)),空间复杂度O(n)

func longestObstacleCourseAtEachPosition(obstacles []int) []int {
   n := len(obstacles)
   res := make([]int, n)

   dp := make([]int, 0)
   for i := 0; i < n; i++ {
      index := sort.SearchInts(dp, obstacles[i]+1)
      if index < len(dp) {
         dp[index] = obstacles[i]
      } else {
         dp = append(dp, obstacles[i])
      }
      res[i] = index + 1
   }
   return res
}

总结

Hard题目,本题是leetcode300.最长上升子序列的变形,时间复杂度为O(n^2)的动态规划容易超时,使用动态规划+二分查找

展开阅读全文

页面更新:2024-02-28

标签:障碍赛跑   最长   路线   位置   本题   下标   复杂度   数组   示例   长度   题目   障碍   高度   时间   动态   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top