小言_互联网的博客

笔试面试题目:盛水最多的容器

408人阅读  评论(0)

     原文发表于:

 

     今天周末,来看G公司的一道面试题:

     求max{|i-j|*min{a[i], a[j]}}的值,其中a是正整数数组,i和j的区间为[0, n-1].

 

      这其实就是leetcode中的“盛水最多的容器”,如下:

 

       鲁迅说:暴力可以解决一切问题。

       胡适说:暴力能解决的问题,都不是问题。

 

       因为i和j的可能性是有限组合,所以暴力算法能得到结果,但无法通过面试。

       用动态规划吗?貌似也不好动态规划。

       我们可以采用双指针,分别指向头尾,计算出盛水值。然后向中间搜索,尝试找出更大的盛水可能性。     

       木桶理论告诉我们:对于两块确定的盛水挡板而言,盛水的多少是由短板决定的。

       所以,在向中间搜索时,从短板侧向中间移动指针,才有可能产生更大的盛水值。

       这是一个核心结论。

 

       至于代码,很简单,来看下:


  
  1. func maxArea(a []int) int {
  2. n := len(a)
  3. if n < 2 {
  4. return 0
  5. }
  6. if n == 2 {
  7. return min(a[ 1], a[ 0])
  8. }
  9. max := min(a[n - 1], a[ 0]) * (n - 1)
  10. i := 0
  11. j := n - 1
  12. for i < j {
  13. if a[i] < a[j] {
  14. i++
  15. } else {
  16. j--
  17. }
  18. area := min(a[i], a[j]) * (j - i)
  19. if area > max {
  20. max = area
  21. }
  22. }
  23. return max
  24. }
  25. func min(x, y int) int {
  26. if x < y {
  27. return x
  28. }
  29. return y
  30. }

      结果:

 

      该算法能正常通过面试,祝大家获得自己心仪的offer.

 

      周末愉快。


转载:https://blog.csdn.net/stpeace/article/details/109544318
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场