2022-12-26:有一个数组包含0、1、2三种值,
有m次修改机会,第一种将所有连通的1变为0,修改次数-1,
第二种将所有连通的2变为1或0,修改次数-2,
返回m次修改机会的情况下,让最大的0连通区,最长能是多少?
1 <= arr长度 <= 10^6,
0 <= 修改机会 <= 10^6。

答案2022-12-26:

六个辅助数组。
时间复杂度:O(N)。

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

  1. #!/bin/bash
  2. # 时间复杂度O(N^3)的方法
  3. # 为了验证
  4. # public static int maxZero1(int[] arr, int k)
  5. function maxZero1(){
  6. eval local arrt=\$$1
  7. local arr=(`echo $arrt | tr ',' ' '`)
  8. local k=$2
  9. local n=${#arr[*]}
  10. local ans=0
  11. local i=0
  12. while [ $i -lt $n ]
  13. do
  14. let local j=n-1
  15. while [ $j -ge $i ]
  16. do
  17. local t=$(cost1 arrt $i $j)
  18. if [ $t -le $k ];then
  19. ans=$(get_max $ans $[$j-$i+1])
  20. break
  21. fi
  22. let j--
  23. done
  24. let i++
  25. done
  26. echo $ans
  27. }
  28. # 为了验证
  29. # public static int cost1(int[] arr, int l, int r)
  30. function cost1() {
  31. eval local arrt=\$$1
  32. local arr=(`echo $arrt | tr ',' ' '`)
  33. local l=$2
  34. local r=$3
  35. local num0=0
  36. local num2=0
  37. let local n=r-l+1
  38. local i=$l
  39. while [ $i -le $r ]
  40. do
  41. if [ ${arr[$i]} == 0 ];then
  42. let num0++
  43. fi
  44. if [ ${arr[$i]} == 2 ];then
  45. let num2++
  46. fi
  47. let i++
  48. done
  49. if [ $num0 == $n ];then
  50. echo -n 0
  51. return 0
  52. fi
  53. if [ $num2 == $n ];then
  54. echo -n 2
  55. return 0
  56. fi
  57. local area2=0
  58. if [ ${arr[$l]} == 2 ];then
  59. area2=1
  60. fi
  61. local i=$l
  62. while [ $i -lt $r ]
  63. do
  64. if [ ${arr[$i]} != 2 ] && [ ${arr[$[$i+1]]} == 2 ];then
  65. let area2++
  66. fi
  67. let i++
  68. done
  69. local has1=0
  70. local areaHas1No0=0
  71. local i=$l
  72. while [ $i -le $r ]
  73. do
  74. if [ ${arr[$i]} == 0 ];then
  75. if [ $has1 == 1 ];then
  76. let areaHas1No0++
  77. fi
  78. has1=0
  79. fi
  80. if [ ${arr[$i]} == 1 ];then
  81. has1=1
  82. fi
  83. let i++
  84. done
  85. if [ $has1 == 1 ];then
  86. let areaHas1No0++
  87. fi
  88. let local ans=2*$area2+areaHas1No0
  89. echo -n $ans
  90. return 0
  91. }
  92. function get_max()
  93. {
  94. if [ $1 -gt $2 ];then
  95. echo -n $1
  96. else
  97. echo -n $2
  98. fi
  99. }
  100. # 正式方法
  101. # 时间复杂度O(N)
  102. left10=()
  103. left2x=()
  104. right10=()
  105. right2x=()
  106. area2s=()
  107. area1s=()
  108. for i in {0..1000000}
  109. do
  110. left10[$i]=0
  111. left2x[$i]=0
  112. right10[$i]=0
  113. right2x[$i]=0
  114. area2s[$i]=0
  115. area1s[$i]=0
  116. done
  117. # public static int maxZero2(int[] arr, int k)
  118. function maxZero2() {
  119. eval local arrt=\$$1
  120. local arr=(`echo $arrt | tr ',' ' '`)
  121. local k=$2
  122. local n=${#arr[*]}
  123. local last=-1
  124. local i=0
  125. while [ $i -lt $n ]
  126. do
  127. if [ ${arr[$i]} == 0 ];then
  128. let last=i
  129. fi
  130. if [ ${arr[$i]} == 1 ];then
  131. let left10[i]=last
  132. fi
  133. let i++
  134. done
  135. let last=-1
  136. local i=0
  137. while [ $i -lt $n ]
  138. do
  139. if [ ${arr[$i]} != 2 ];then
  140. let last=i
  141. fi
  142. if [ ${arr[$i]} == 2 ];then
  143. let left2x[i]=last
  144. fi
  145. let i++
  146. done
  147. let last=n
  148. let i=n-1
  149. while [ $i -ge 0 ]
  150. do
  151. if [ ${arr[$i]} == 0 ];then
  152. let last=i
  153. fi
  154. if [ ${arr[$i]} == 1 ];then
  155. let right10[i]=last
  156. fi
  157. let i--
  158. done
  159. let last=n
  160. let i=n-1
  161. while [ $i -ge 0 ]
  162. do
  163. if [ ${arr[$i]} != 2 ];then
  164. let last=i
  165. fi
  166. if [ ${arr[$i]} == 2 ];then
  167. let right2x[i]=last
  168. fi
  169. let i--
  170. done
  171. local area2=0
  172. if [ ${arr[0]} == 2 ];then
  173. let area2=1
  174. fi
  175. local i=0
  176. while [ $i -lt $[$n-1] ]
  177. do
  178. if [ ${arr[$i]} != 2 ];then
  179. let area2s[i]=area2
  180. if [ ${arr[$[$i+1]]} == 2 ];then
  181. let area2++
  182. fi
  183. fi
  184. let i++
  185. done
  186. # let local t=n-1
  187. if [ ${arr[$[$n-1]]} != 2 ];then
  188. let area2s[$[$n-1]]=area2
  189. fi
  190. local has1=0
  191. local area1=0
  192. local i=0
  193. while [ $i -lt $n ]
  194. do
  195. if [ ${arr[$i]} == 0 ];then
  196. if [ $has1 == 1 ];then
  197. let area1++
  198. fi
  199. let has1=0
  200. let area1s[i]=area1
  201. fi
  202. if [ ${arr[$i]} == 1 ];then
  203. let has1=1
  204. fi
  205. let i++
  206. done
  207. local ans=0
  208. local right=0
  209. local left=0
  210. while [ $left -lt $n ]
  211. do
  212. while [ $right -lt $n ] && [ $(cost2 arrt $left $right) -le $k ]
  213. do
  214. let right++
  215. done
  216. let local t=right-left
  217. ans=$(get_max $ans $t)
  218. let t=left+1
  219. right=$(get_max $right $t)
  220. let left++
  221. done
  222. echo -n $ans
  223. return 0
  224. }
  225. # public static int cost2(int[] arr, int left, int right)
  226. function cost2() {
  227. eval local arrt=\$$1
  228. local arr=(`echo $arrt | tr ',' ' '`)
  229. local left=$2
  230. local right=$3
  231. if [ ${arr[$left]} == 2 ] && [ ${right2x[$left]} -gt $right ];then
  232. echo -n 2
  233. return 0
  234. fi
  235. local area2=0
  236. if [ ${arr[$left]} == 2 ];then
  237. let area2=1
  238. fi
  239. if [ ${arr[$right]} == 2 ];then
  240. let area2++
  241. fi
  242. if [ ${arr[$left]} == 2 ];then
  243. let left=right2x[left]
  244. fi
  245. if [ ${arr[$right]} == 2 ];then
  246. let right=left2x[right]
  247. fi
  248. let area2+=area2s[right]-area2s[left]
  249. local area1=0
  250. if [ ${arr[$left]} == 0 ] && [ ${arr[$right]} == 0 ];then
  251. let area1=area1s[right]-area1s[left]
  252. elif [ ${arr[$left]} == 0 ];then
  253. let area1++
  254. let right=left10[right]
  255. let area1+=area1s[right]-area1s[left]
  256. elif [ ${arr[$right]} == 0 ];then
  257. let area1++
  258. let left=right10[left]
  259. let area1+=area1s[right]-area1s[left]
  260. else
  261. if [ ${right10[$left]} -gt $right ];then
  262. let area1++
  263. else
  264. let area1+=2
  265. let left=right10[left];
  266. let right=left10[right];
  267. let area1+=area1s[right]-area1s[left];
  268. fi
  269. fi
  270. let local ans=2*area2+area1
  271. echo -n $ans
  272. return 0
  273. }
  274. # public static int[] randomArray(int n)
  275. function random_array()
  276. {
  277. local n=$1
  278. local ans=()
  279. local i=0
  280. while [ $i -lt $n ]
  281. do
  282. let ans[$i]=$RANDOM%3
  283. let i++
  284. done
  285. echo -n ${ans[*]}
  286. return 0
  287. }
  288. # public static void main(String[] args)
  289. function main()
  290. {
  291. local n=5
  292. local testTimes=5
  293. printf "测试开始\r\n"
  294. local i=1
  295. while [ $i -le $testTimes ]
  296. do
  297. local arrt=$(random_array $n)
  298. local k=1
  299. printf "arrt=$arrt,k=$k\r\n"
  300. local arr=(`echo $arrt | tr ',' ' '`)
  301. local ans1=$(maxZero1 arrt $k)
  302. local ans2=$(maxZero2 arrt $k)
  303. if [ $ans1 != $ans2 ]
  304. then
  305. printf "错误ans1 = %s\r\n" $ans1
  306. printf "错误ans2 = %s\r\n" $ans2
  307. break
  308. fi
  309. printf "==ans = %s\r\n" $ans1
  310. printf "$i end===============\r\n"
  311. i=$[$i+1]
  312. done
  313. printf "测试结束\r\n"
  314. }
  315. main

贪心验证如下:

  1. #!/bin/bash
  2. I32MAX=2147483647
  3. # public static int getMin(int a, int b)
  4. function get_min()
  5. {
  6. if [ $1 -lt $2 ];then
  7. echo $1
  8. else
  9. echo $2
  10. fi
  11. }
  12. # public static int best1(int[] arr)
  13. function best1()
  14. {
  15. eval local arrt=\$$1
  16. local arr=(`echo $arrt | tr ',' ' '`)
  17. local zero=0
  18. local two=0
  19. local n=${#arr[*]}
  20. local i=0
  21. while [ $i -lt $n ]
  22. do
  23. if [ ${arr[$i]} == 0 ];then
  24. let zero++
  25. fi
  26. if [ ${arr[$i]} == 2 ];then
  27. let two++
  28. fi
  29. let i++
  30. done
  31. if [ $zero == $n ];then
  32. echo -n 0
  33. return 0
  34. fi
  35. if [ $two == $n ];then
  36. echo -n 2
  37. return 0
  38. fi
  39. local ans=$I32MAX
  40. local i=0
  41. while [ $i -lt $n ]
  42. do
  43. if [ ${arr[$i]} != 0 ] && ([ $i == 0 ] || [ ${arr[$[$i-1]]} != ${arr[$i]} ])
  44. then
  45. if [ ${arr[$i]} == 2 ]
  46. then
  47. local temp1=$(change arrt $i 1)
  48. temp1a=$(best1 temp1)
  49. local temp0=$(change arrt $i 0)
  50. temp0a=(`echo -n $temp0 | tr ',' ' '`)
  51. temp0a=$(best1 temp0)
  52. local temp=$(get_min $temp1a $temp0a)
  53. let temp=temp+2
  54. ans=$(get_min $ans $temp)
  55. else
  56. local temp=$(change arrt $i 0)
  57. local tempa=(`echo -n $temp | tr ',' ' '`)
  58. temp=$(best1 temp)
  59. let temp++
  60. ans=$(get_min $ans $temp)
  61. fi
  62. fi
  63. let i++
  64. done
  65. echo -n $ans
  66. return 0
  67. }
  68. # public static int[] change(int[] arr, int i, int to)
  69. function change()
  70. {
  71. eval local arr=\$$1
  72. arr=(`echo $arr | tr ',' ' '`)
  73. local i=$2
  74. local to=$3
  75. local l=$i
  76. local r=$i
  77. while [ $l -ge 0 ] && [ ${arr[$l]} == ${arr[$i]} ]
  78. do
  79. let l--
  80. done
  81. while [ $r -lt ${#arr[*]} ] && [ ${arr[$r]} == ${arr[$i]} ]
  82. do
  83. let r++
  84. done
  85. local ans=()
  86. i=0
  87. while [ $i -lt ${#arr[*]} ]
  88. do
  89. let ans[i]=arr[i]
  90. let i++
  91. done
  92. let i=l+1
  93. while [ $i -lt $r ]
  94. do
  95. let ans[i]=to
  96. let i++
  97. done
  98. # 返回ans
  99. echo -n ${ans[*]}
  100. }
  101. # public static int cost(int[] arr, int l, int r)
  102. function cost()
  103. {
  104. eval local arr=\$$1
  105. local arr=(`echo $arr | tr ',' ' '`)
  106. local l=$2
  107. local r=$3
  108. local num0=0
  109. local num2=0
  110. let local n=r-l+1
  111. let local i=l
  112. while [ $i -le $r ]
  113. do
  114. if [ ${arr[$i]} == 0 ];then
  115. let num0++
  116. fi
  117. if [ ${arr[$i]} == 2 ];then
  118. let num2++
  119. fi
  120. let i++
  121. done
  122. if [ $num0 == $n ];then
  123. echo -n 0
  124. return 0
  125. fi
  126. if [ $num2 == $n ];then
  127. echo -n 2
  128. return 0
  129. fi
  130. local area2=0
  131. if [ ${arr[$l]} == 2 ];then
  132. let area2=1
  133. fi
  134. local i=$l
  135. while [ $i -lt $r ]
  136. do
  137. local j=i+1
  138. if [ ${arr[$i]} != 2 ] && [ ${arr[$j]} == 2 ]
  139. then
  140. let area2++
  141. fi
  142. let i++
  143. done
  144. local has1=0
  145. local areaHas1No0=0
  146. i=$l
  147. while [ $i -le $r ]
  148. do
  149. if [ ${arr[$i]} == 0 ];then
  150. if [ $has1 == 1 ];then
  151. let areaHas1No0++
  152. fi
  153. has1=0
  154. fi
  155. if [ ${arr[$i]} == 1 ];then
  156. let has1=1
  157. fi
  158. let i++
  159. done
  160. if [ $has1 == 1 ];then
  161. let areaHas1No0++
  162. fi
  163. let local ans=2*$area2+areaHas1No0
  164. echo -n $ans
  165. return 0
  166. }
  167. # public static int[] randomArray(int n)
  168. function random_array()
  169. {
  170. local n=$1
  171. local ans=()
  172. local i=0
  173. while [ $i -lt $n ]
  174. do
  175. let ans[$i]=$RANDOM%3
  176. let i++
  177. done
  178. echo -n ${ans[*]}
  179. return 0
  180. }
  181. # public static void main(String[] args)
  182. function main()
  183. {
  184. local n=5
  185. local testTimes=5
  186. printf "测试开始\r\n"
  187. local i=0
  188. while [ $i -lt $testTimes ]
  189. do
  190. local arr=$(random_array $n)
  191. printf "arr=$arr\r\n"
  192. local arrt=(`echo $arr | tr ',' ' '`)
  193. local ans1=$(best1 arr)
  194. local ans2=$(cost arr 0 $[${#arrt[*]}-1])
  195. if [ $ans1 != $ans2 ]
  196. then
  197. printf "错误ans1 = %s\r\n" $ans1
  198. printf "错误ans2 = %s\r\n" $ans2
  199. break
  200. fi
  201. printf "==ans1 = %s\r\n" $ans1
  202. printf "==ans2 = %s\r\n" $ans2
  203. printf "$i end===============\r\n"
  204. i=$[$i+1]
  205. done
  206. printf "测试结束\r\n"
  207. }
  208. main
  209. # public static void main(String[] args)
  210. function main1()
  211. {
  212. local n=5
  213. local testTimes=1
  214. printf "测试开始\r\n"
  215. local i=0
  216. while [ $i -lt $testTimes ]
  217. do
  218. local arr=$(random_array $n)
  219. printf "main arr = $arr\r\n"
  220. local arrt=(`echo $arr | tr ',' ' '`)
  221. local ans2=$(cost arr 0 $[${#arrt[*]}-1])
  222. printf "ans2 = %s\r\n" $ans2
  223. printf "end===============\r\n"
  224. i=$[$i+1]
  225. done
  226. printf "测试结束\r\n"
  227. }

2022-12-26:有一个数组包含0、1、2三种值, 有m次修改机会,第一种将所有连通的1变为0,修改次数-1, 第二种将所有连通的2变为1或0,修改次数-2, 返回m次修改机会的情况下,让最大的0的更多相关文章

  1. 混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。

    看到一个kinect大牛编写的一个水果忍者的体感游戏版本号,让我为自己一直以来仅仅用现有的网页游戏来模拟kinect体感游戏控制感到羞愧,没办法.我还是菜鸟.学习一段后自己模仿星际大战这个游戏.自己写 ...

  2. 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置

    package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...

  3. 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...

  4. 七、如何在Java中高效检查一个数组是否含有一个值

    如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非 ...

  5. Java 高效检查一个数组中是否包含某个值

    如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...

  6. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  7. 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...

  8. Log4j 2使用教程 分类: B1_JAVA 2014-07-01 12:26 314人阅读 评论(0) 收藏

    转载自 Blog of 天外的星星: http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html Log4j 2的好处就不和大家说了,如果你搜了2,说明你 ...

  9. 编写一个方法,输入DOM节点,返回包含所有父节点的一个数组

    编写一个方法,输入DOM节点,返回包含所有父节点的一个数组 function getParentsNodes(element) { var parents = []; var getParentsNo ...

  10. 包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

    1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值     栈  3,4,2,5,1     辅助栈 3,2,1 每入栈一次,就与辅 ...

随机推荐

  1. 基于Rocky Linux搭建Windows域控制器

    1.基于Rocky Linux搭建Windows域控制器 https://blog.csdn.net/Sakura0156/article/details/125822938?spm=1001.210 ...

  2. 截取屏幕 转为GIF 图片

    近期winform 做的一个截取屏幕的软件给大家!谁要留言给我哦! sss

  3. msfvenom的使用

    msfvenom也只metasploit中的一个很强的工具,msfvenom生成木马非常的迅速可以各种版本的木马 该工具由msfpaylod和msfencodes的组成 生成木马是需要在本地监听,等待 ...

  4. 【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)

    概念简介 Paxos是一种基于消息传递具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一. 发展历史 Paxos算法的发展历史追溯到古希腊,当时有一个名为"Pax ...

  5. linux中查看用户和组信息小结

    查看当前登录用户的组内成员groups 查看当前登录用户名whoami 查看tom用户所在的组,以及组内成员groups tom 查看所有的用户信息cat /etc/passwd 用户名.密码.用户i ...

  6. 分库分表ShardingJDBC最佳实践

    1 添加依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId> ...

  7. dart基础---->函数传值

    1. string type main(List<String> args) { String name = "huhx"; changIt(name); print( ...

  8. MarkdownStudy03JDK

    卸载JDK 删除jdk文件夹 删除配置环境(计算机>属性>高级>系统变量中的JAVA_HOME和Path) 删除JAVA_HOME环境变量 删除path环境变量 用dos窗口查看是否 ...

  9. API网关:开源Apinto网关快速入门

    Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,开箱即用.Apinto除了提供丰富的网关插件外,还提供监控告警.用户角色等扩展应用,同时支持自定义网关插 ...

  10. 驱动开发:探索DRIVER_OBJECT驱动对象

    本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些 ...