龙空技术网

leetcode1802_go_有界数组中指定下标处的最大值

每天都AC 69

前言:

今天姐妹们对“java输出数组最大值和下标”可能比较关心,小伙伴们都想要剖析一些“java输出数组最大值和下标”的相关资讯。那么小编也在网摘上搜集了一些有关“java输出数组最大值和下标””的相关内容,希望姐妹们能喜欢,我们一起来学习一下吧!

题目

给你三个正整数 n、index 和 maxSum 。

你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):

nums.length == n

nums[i] 是 正整数 ,其中 0 <= i < n

abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1

nums 中所有元素之和不超过 maxSum

nums[index] 的值被 最大化

返回你所构造的数组中的 nums[index] 。

注意:abs(x) 等于 x 的前提是 x >= 0 ;否则,abs(x) 等于 -x 。

示例 1:输入:n = 4, index = 2, maxSum = 6 输出:2

解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。不存在其他在指定下标处具有更大值的有效数组。

示例 2:输入:n = 6, index = 1, maxSum = 10 输出:3

提示:1 <= n <= maxSum <= 109

0 <= index < n

解题思路分析

1、二分查找;时间复杂度O(log(n)),空间复杂度O(1)

func maxValue(n int, index int, maxSum int) int {   if n == 1 {      return maxSum   }   res := 1   leftTotal, rightTotal := index, n-index-1   left, right := 1, maxSum   for left < right {      mid := left + (right-left)/2      l := getTotal(mid, leftTotal)      r := getTotal(mid, rightTotal)      if l+r+mid <= maxSum {         left = mid + 1         res = mid      } else {         right = mid      }   }   return res}func getTotal(high int, total int) int {   need := high - 1   if need >= total {      return total * (need + high - total) / 2   }   return need*(1+need)/2 + total - need}

2、二分查找;时间复杂度O(log(n)),空间复杂度O(1)

func maxValue(n int, index int, maxSum int) int {   res := 1   leftTotal, rightTotal := index, n-index-1   left, right := 1, maxSum+1   for left < right {      mid := left + (right-left)/2      l := getTotal(mid, leftTotal)      r := getTotal(mid, rightTotal)      if l+r+mid <= maxSum {         left = mid + 1         res = mid      } else {         right = mid      }   }   return res}func getTotal(high int, total int) int {   need := high - 1   if need >= total {      return total * (need + high - total) / 2   }   return need*(1+need)/2 + total - need}
总结

Medium题目,采用贪心思想计算可以构造的数组,采用二分查找的方式计算可以达到的nums[index] 的最大值

标签: #java输出数组最大值和下标