2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1,
arr中的0、n-1位置不需要达标,它们分别是最左、最右的位置,
中间位置i需要达标,达标的条件是 : arr[i-1] > arr[i] 或者 arr[i+1] > arr[i]哪个都可以。
你每一步可以进行如下操作:对任何位置的数让其-1,
你的目的是让arr[1~n-2]都达标,这时arr称之为yeah!数组。
返回至少要多少步可以让arr变成yeah!数组。
数据规模 : 数组长度 <= 10000,数组中的值<=500。
来自360面试。

答案2022-01-12:

方法一、动态规划。
方法二、贪心。
时间复杂度:O(N)。
空间复杂度:O(N)。

代码用golang编写。代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func main() {
  7. if true {
  8. arr := []int{3, 2, 1, 2, 4, 4}
  9. ret := minCost1(arr)
  10. fmt.Println(ret)
  11. }
  12. if true {
  13. arr := []int{3, 2, 1, 2, 4, 4}
  14. ret := yeah(arr)
  15. fmt.Println(ret)
  16. }
  17. }
  18. const INVALID = math.MaxInt64
  19. // 递归方法,已经把尝试写出
  20. func minCost1(arr []int) int {
  21. if len(arr) < 3 {
  22. return 0
  23. }
  24. min := INVALID
  25. for _, num := range arr {
  26. min = getMin(min, num)
  27. }
  28. for i := 0; i < len(arr); i++ {
  29. arr[i] += len(arr) - min
  30. }
  31. return process1(arr, 1, arr[0], true)
  32. }
  33. // 当前来到index位置,值arr[index]
  34. // pre : 前一个位置的值,可能减掉了一些,所以不能用arr[index-1]
  35. // preOk : 前一个位置的值,是否被它左边的数变有效了
  36. // 返回 : 让arr都变有效,最小代价是什么?
  37. func process1(arr []int, index, pre int, preOk bool) int {
  38. if index == len(arr)-1 { // 已经来到最后一个数了
  39. if preOk || pre < arr[index] {
  40. return 0
  41. } else {
  42. return INVALID
  43. }
  44. //return preOk || pre < arr[index] ? 0 : INVALID;
  45. }
  46. // 当前index,不是最后一个数!
  47. ans := INVALID
  48. if preOk {
  49. for cur := arr[index]; cur >= 0; cur-- {
  50. next := process1(arr, index+1, cur, cur < pre)
  51. if next != INVALID {
  52. ans = getMin(ans, arr[index]-cur+next)
  53. }
  54. }
  55. } else {
  56. for cur := arr[index]; cur > pre; cur-- {
  57. next := process1(arr, index+1, cur, false)
  58. if next != INVALID {
  59. ans = getMin(ans, arr[index]-cur+next)
  60. }
  61. }
  62. }
  63. return ans
  64. }
  65. // 最终的最优解,贪心
  66. // 时间复杂度O(N)
  67. // 请注意,重点看上面的方法
  68. // 这个最优解容易理解,但让你学到的东西不是很多
  69. func yeah(arr []int) int {
  70. if len(arr) < 3 {
  71. return 0
  72. }
  73. n := len(arr)
  74. nums := make([]int, n+2)
  75. nums[0] = math.MaxInt64
  76. nums[n+1] = math.MaxInt64
  77. for i := 0; i < len(arr); i++ {
  78. nums[i+1] = arr[i]
  79. }
  80. leftCost := make([]int, n+2)
  81. pre := nums[0]
  82. change := 0
  83. for i := 1; i <= n; i++ {
  84. change = getMin(pre-1, nums[i])
  85. leftCost[i] = nums[i] - change + leftCost[i-1]
  86. pre = change
  87. }
  88. rightCost := make([]int, n+2)
  89. pre = nums[n+1]
  90. for i := n; i >= 1; i-- {
  91. change = getMin(pre-1, nums[i])
  92. rightCost[i] = nums[i] - change + rightCost[i+1]
  93. pre = change
  94. }
  95. ans := math.MaxInt64
  96. for i := 1; i <= n; i++ {
  97. ans = getMin(ans, leftCost[i]+rightCost[i+1])
  98. }
  99. return ans
  100. }
  101. func getMin(a, b int) int {
  102. if a < b {
  103. return a
  104. } else {
  105. return b
  106. }
  107. }

执行结果如下:


左神java代码

2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0、n-1位置不需要达标,它们分别是最左、最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >的更多相关文章

  1. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  2. (016)给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树(keep it up)

    给定一个有序数组(递增),敲代码构建一棵具有最小高度的二叉树. 因为数组是递增有序的.每次都在中间创建结点,类似二分查找的方法来间最小树. struct TreeNode { int data; Tr ...

  3. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  4. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  5. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  6. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  7. 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)

    45.雅虎(运算.矩阵): 2.一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值 比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4 ...

  8. 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复 用一个ArrayList存储1到100然后随机产生0到arraylist.size()之间的数字作为下标然后从arrayli ...

  9. Java实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。

    public static void main(String[] args){ //创建一个int数组,长度为100, int n = 100; int[] arrayInt = new int[n] ...

  10. 给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

    思路 首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置. 然后再从右往左遍历,设定一个Min,在遍历的过程中arra ...

随机推荐

  1. 操作kubernets(k8s)的增删改查

    资源的CRUD: 创建: Service service = client.services().inNamespace(namespace).create(service); 更新: Namespa ...

  2. IDEA下Maven项目中通过JDBC连接MySQL数据库

    ### 1. 在当前Maven项目的pom.xml文件中导入数据库依赖: ```<dependency> <groupId>mysql</groupId> < ...

  3. 在CentOS中安装Docker

    概述 Docker是一款使用Golang开发的开源容器引擎,我们可以使用Docker将自己的应用和相关依赖进行打包,实现在不同服务器上进行快速部署,而不需要再更多关注部署环境的差异性.结合kubern ...

  4. [网鼎杯 2018]Fakebook

    1.解题过程 1.sql注入 访问web页面有一个login和join ![1](https://raw.githubusercontent.com/lanchuangdexingjian/Blog- ...

  5. 正则表达式(cases)

    匹配不含'aaa'和'bbb'的字符串: ^(?!.*aaa)(?!.*bbb).*$ To be continue...

  6. 股票数据Scrapy爬虫实例(亲测有效)

    步骤: 步骤1:建立工程和Spider模板 scrapy startproject BaiduStocks cd BaiduStocks scrapy genspider stocks baidu.c ...

  7. 2023年数字化经济与管理科学国际学术会议(CDEMS2023)

    基本信息 大会官网:www.cdems.org 大会时间:2023年4月21-23日 大会地点:中国开封 截稿时间:2023年4月16日(此处有变动) 接受/拒稿通知:投稿后1周 收录检索:CPCI, ...

  8. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设. 关于 i.MXRT1xxx 系列芯片 BootROM 中集成的 ...

  9. CentOS&RHEL内核升级

    在安装部署一些环境的时候,会要求内核版本的要求,可以通过YUM工具进行安装配置更高版本的内核,当然更新内核有风险,在操作之前慎重,严谨在生产环境操作! 安装源 # 为 RHEL-8或 CentOS-8 ...

  10. 京东LBS推荐算法实践

    作者:京东零售 郑书剑 1.推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店.到家两种业务场景.同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主 ...