2022-12-26:有一个数组包含0、1、2三种值, 有m次修改机会,第一种将所有连通的1变为0,修改次数-1, 第二种将所有连通的2变为1或0,修改次数-2, 返回m次修改机会的情况下,让最大的0
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编写。代码如下:
#!/bin/bash
# 时间复杂度O(N^3)的方法
# 为了验证
# public static int maxZero1(int[] arr, int k)
function maxZero1(){
eval local arrt=\$$1
local arr=(`echo $arrt | tr ',' ' '`)
local k=$2
local n=${#arr[*]}
local ans=0
local i=0
while [ $i -lt $n ]
do
let local j=n-1
while [ $j -ge $i ]
do
local t=$(cost1 arrt $i $j)
if [ $t -le $k ];then
ans=$(get_max $ans $[$j-$i+1])
break
fi
let j--
done
let i++
done
echo $ans
}
# 为了验证
# public static int cost1(int[] arr, int l, int r)
function cost1() {
eval local arrt=\$$1
local arr=(`echo $arrt | tr ',' ' '`)
local l=$2
local r=$3
local num0=0
local num2=0
let local n=r-l+1
local i=$l
while [ $i -le $r ]
do
if [ ${arr[$i]} == 0 ];then
let num0++
fi
if [ ${arr[$i]} == 2 ];then
let num2++
fi
let i++
done
if [ $num0 == $n ];then
echo -n 0
return 0
fi
if [ $num2 == $n ];then
echo -n 2
return 0
fi
local area2=0
if [ ${arr[$l]} == 2 ];then
area2=1
fi
local i=$l
while [ $i -lt $r ]
do
if [ ${arr[$i]} != 2 ] && [ ${arr[$[$i+1]]} == 2 ];then
let area2++
fi
let i++
done
local has1=0
local areaHas1No0=0
local i=$l
while [ $i -le $r ]
do
if [ ${arr[$i]} == 0 ];then
if [ $has1 == 1 ];then
let areaHas1No0++
fi
has1=0
fi
if [ ${arr[$i]} == 1 ];then
has1=1
fi
let i++
done
if [ $has1 == 1 ];then
let areaHas1No0++
fi
let local ans=2*$area2+areaHas1No0
echo -n $ans
return 0
}
function get_max()
{
if [ $1 -gt $2 ];then
echo -n $1
else
echo -n $2
fi
}
# 正式方法
# 时间复杂度O(N)
left10=()
left2x=()
right10=()
right2x=()
area2s=()
area1s=()
for i in {0..1000000}
do
left10[$i]=0
left2x[$i]=0
right10[$i]=0
right2x[$i]=0
area2s[$i]=0
area1s[$i]=0
done
# public static int maxZero2(int[] arr, int k)
function maxZero2() {
eval local arrt=\$$1
local arr=(`echo $arrt | tr ',' ' '`)
local k=$2
local n=${#arr[*]}
local last=-1
local i=0
while [ $i -lt $n ]
do
if [ ${arr[$i]} == 0 ];then
let last=i
fi
if [ ${arr[$i]} == 1 ];then
let left10[i]=last
fi
let i++
done
let last=-1
local i=0
while [ $i -lt $n ]
do
if [ ${arr[$i]} != 2 ];then
let last=i
fi
if [ ${arr[$i]} == 2 ];then
let left2x[i]=last
fi
let i++
done
let last=n
let i=n-1
while [ $i -ge 0 ]
do
if [ ${arr[$i]} == 0 ];then
let last=i
fi
if [ ${arr[$i]} == 1 ];then
let right10[i]=last
fi
let i--
done
let last=n
let i=n-1
while [ $i -ge 0 ]
do
if [ ${arr[$i]} != 2 ];then
let last=i
fi
if [ ${arr[$i]} == 2 ];then
let right2x[i]=last
fi
let i--
done
local area2=0
if [ ${arr[0]} == 2 ];then
let area2=1
fi
local i=0
while [ $i -lt $[$n-1] ]
do
if [ ${arr[$i]} != 2 ];then
let area2s[i]=area2
if [ ${arr[$[$i+1]]} == 2 ];then
let area2++
fi
fi
let i++
done
# let local t=n-1
if [ ${arr[$[$n-1]]} != 2 ];then
let area2s[$[$n-1]]=area2
fi
local has1=0
local area1=0
local i=0
while [ $i -lt $n ]
do
if [ ${arr[$i]} == 0 ];then
if [ $has1 == 1 ];then
let area1++
fi
let has1=0
let area1s[i]=area1
fi
if [ ${arr[$i]} == 1 ];then
let has1=1
fi
let i++
done
local ans=0
local right=0
local left=0
while [ $left -lt $n ]
do
while [ $right -lt $n ] && [ $(cost2 arrt $left $right) -le $k ]
do
let right++
done
let local t=right-left
ans=$(get_max $ans $t)
let t=left+1
right=$(get_max $right $t)
let left++
done
echo -n $ans
return 0
}
# public static int cost2(int[] arr, int left, int right)
function cost2() {
eval local arrt=\$$1
local arr=(`echo $arrt | tr ',' ' '`)
local left=$2
local right=$3
if [ ${arr[$left]} == 2 ] && [ ${right2x[$left]} -gt $right ];then
echo -n 2
return 0
fi
local area2=0
if [ ${arr[$left]} == 2 ];then
let area2=1
fi
if [ ${arr[$right]} == 2 ];then
let area2++
fi
if [ ${arr[$left]} == 2 ];then
let left=right2x[left]
fi
if [ ${arr[$right]} == 2 ];then
let right=left2x[right]
fi
let area2+=area2s[right]-area2s[left]
local area1=0
if [ ${arr[$left]} == 0 ] && [ ${arr[$right]} == 0 ];then
let area1=area1s[right]-area1s[left]
elif [ ${arr[$left]} == 0 ];then
let area1++
let right=left10[right]
let area1+=area1s[right]-area1s[left]
elif [ ${arr[$right]} == 0 ];then
let area1++
let left=right10[left]
let area1+=area1s[right]-area1s[left]
else
if [ ${right10[$left]} -gt $right ];then
let area1++
else
let area1+=2
let left=right10[left];
let right=left10[right];
let area1+=area1s[right]-area1s[left];
fi
fi
let local ans=2*area2+area1
echo -n $ans
return 0
}
# public static int[] randomArray(int n)
function random_array()
{
local n=$1
local ans=()
local i=0
while [ $i -lt $n ]
do
let ans[$i]=$RANDOM%3
let i++
done
echo -n ${ans[*]}
return 0
}
# public static void main(String[] args)
function main()
{
local n=5
local testTimes=5
printf "测试开始\r\n"
local i=1
while [ $i -le $testTimes ]
do
local arrt=$(random_array $n)
local k=1
printf "arrt=$arrt,k=$k\r\n"
local arr=(`echo $arrt | tr ',' ' '`)
local ans1=$(maxZero1 arrt $k)
local ans2=$(maxZero2 arrt $k)
if [ $ans1 != $ans2 ]
then
printf "错误ans1 = %s\r\n" $ans1
printf "错误ans2 = %s\r\n" $ans2
break
fi
printf "==ans = %s\r\n" $ans1
printf "$i end===============\r\n"
i=$[$i+1]
done
printf "测试结束\r\n"
}
main
贪心验证如下:
#!/bin/bash
I32MAX=2147483647
# public static int getMin(int a, int b)
function get_min()
{
if [ $1 -lt $2 ];then
echo $1
else
echo $2
fi
}
# public static int best1(int[] arr)
function best1()
{
eval local arrt=\$$1
local arr=(`echo $arrt | tr ',' ' '`)
local zero=0
local two=0
local n=${#arr[*]}
local i=0
while [ $i -lt $n ]
do
if [ ${arr[$i]} == 0 ];then
let zero++
fi
if [ ${arr[$i]} == 2 ];then
let two++
fi
let i++
done
if [ $zero == $n ];then
echo -n 0
return 0
fi
if [ $two == $n ];then
echo -n 2
return 0
fi
local ans=$I32MAX
local i=0
while [ $i -lt $n ]
do
if [ ${arr[$i]} != 0 ] && ([ $i == 0 ] || [ ${arr[$[$i-1]]} != ${arr[$i]} ])
then
if [ ${arr[$i]} == 2 ]
then
local temp1=$(change arrt $i 1)
temp1a=$(best1 temp1)
local temp0=$(change arrt $i 0)
temp0a=(`echo -n $temp0 | tr ',' ' '`)
temp0a=$(best1 temp0)
local temp=$(get_min $temp1a $temp0a)
let temp=temp+2
ans=$(get_min $ans $temp)
else
local temp=$(change arrt $i 0)
local tempa=(`echo -n $temp | tr ',' ' '`)
temp=$(best1 temp)
let temp++
ans=$(get_min $ans $temp)
fi
fi
let i++
done
echo -n $ans
return 0
}
# public static int[] change(int[] arr, int i, int to)
function change()
{
eval local arr=\$$1
arr=(`echo $arr | tr ',' ' '`)
local i=$2
local to=$3
local l=$i
local r=$i
while [ $l -ge 0 ] && [ ${arr[$l]} == ${arr[$i]} ]
do
let l--
done
while [ $r -lt ${#arr[*]} ] && [ ${arr[$r]} == ${arr[$i]} ]
do
let r++
done
local ans=()
i=0
while [ $i -lt ${#arr[*]} ]
do
let ans[i]=arr[i]
let i++
done
let i=l+1
while [ $i -lt $r ]
do
let ans[i]=to
let i++
done
# 返回ans
echo -n ${ans[*]}
}
# public static int cost(int[] arr, int l, int r)
function cost()
{
eval local arr=\$$1
local arr=(`echo $arr | tr ',' ' '`)
local l=$2
local r=$3
local num0=0
local num2=0
let local n=r-l+1
let local i=l
while [ $i -le $r ]
do
if [ ${arr[$i]} == 0 ];then
let num0++
fi
if [ ${arr[$i]} == 2 ];then
let num2++
fi
let i++
done
if [ $num0 == $n ];then
echo -n 0
return 0
fi
if [ $num2 == $n ];then
echo -n 2
return 0
fi
local area2=0
if [ ${arr[$l]} == 2 ];then
let area2=1
fi
local i=$l
while [ $i -lt $r ]
do
local j=i+1
if [ ${arr[$i]} != 2 ] && [ ${arr[$j]} == 2 ]
then
let area2++
fi
let i++
done
local has1=0
local areaHas1No0=0
i=$l
while [ $i -le $r ]
do
if [ ${arr[$i]} == 0 ];then
if [ $has1 == 1 ];then
let areaHas1No0++
fi
has1=0
fi
if [ ${arr[$i]} == 1 ];then
let has1=1
fi
let i++
done
if [ $has1 == 1 ];then
let areaHas1No0++
fi
let local ans=2*$area2+areaHas1No0
echo -n $ans
return 0
}
# public static int[] randomArray(int n)
function random_array()
{
local n=$1
local ans=()
local i=0
while [ $i -lt $n ]
do
let ans[$i]=$RANDOM%3
let i++
done
echo -n ${ans[*]}
return 0
}
# public static void main(String[] args)
function main()
{
local n=5
local testTimes=5
printf "测试开始\r\n"
local i=0
while [ $i -lt $testTimes ]
do
local arr=$(random_array $n)
printf "arr=$arr\r\n"
local arrt=(`echo $arr | tr ',' ' '`)
local ans1=$(best1 arr)
local ans2=$(cost arr 0 $[${#arrt[*]}-1])
if [ $ans1 != $ans2 ]
then
printf "错误ans1 = %s\r\n" $ans1
printf "错误ans2 = %s\r\n" $ans2
break
fi
printf "==ans1 = %s\r\n" $ans1
printf "==ans2 = %s\r\n" $ans2
printf "$i end===============\r\n"
i=$[$i+1]
done
printf "测试结束\r\n"
}
main
# public static void main(String[] args)
function main1()
{
local n=5
local testTimes=1
printf "测试开始\r\n"
local i=0
while [ $i -lt $testTimes ]
do
local arr=$(random_array $n)
printf "main arr = $arr\r\n"
local arrt=(`echo $arr | tr ',' ' '`)
local ans2=$(cost arr 0 $[${#arrt[*]}-1])
printf "ans2 = %s\r\n" $ans2
printf "end===============\r\n"
i=$[$i+1]
done
printf "测试结束\r\n"
}
2022-12-26:有一个数组包含0、1、2三种值, 有m次修改机会,第一种将所有连通的1变为0,修改次数-1, 第二种将所有连通的2变为1或0,修改次数-2, 返回m次修改机会的情况下,让最大的0的更多相关文章
- 混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。
看到一个kinect大牛编写的一个水果忍者的体感游戏版本号,让我为自己一直以来仅仅用现有的网页游戏来模拟kinect体感游戏控制感到羞愧,没办法.我还是菜鸟.学习一段后自己模仿星际大战这个游戏.自己写 ...
- 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置
package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...
- 9、Cocos2dx 3.0游戏开发三查找值小工厂方法模式和对象
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- 七、如何在Java中高效检查一个数组是否含有一个值
如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非 ...
- Java 高效检查一个数组中是否包含某个值
如何检查一个数组(未排序)中是否包含某个特定的值?在Java中,这是一个非常有用并又很常用的操作.同时,在StackOverflow中,有时一个得票非常高的问题.在得票比较高的几个回答中,时间复杂度差 ...
- 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)
""" #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...
- 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...
- 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,说明你 ...
- 编写一个方法,输入DOM节点,返回包含所有父节点的一个数组
编写一个方法,输入DOM节点,返回包含所有父节点的一个数组 function getParentsNodes(element) { var parents = []; var getParentsNo ...
- 包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈
1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈 3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅 ...
随机推荐
- 基于Rocky Linux搭建Windows域控制器
1.基于Rocky Linux搭建Windows域控制器 https://blog.csdn.net/Sakura0156/article/details/125822938?spm=1001.210 ...
- 截取屏幕 转为GIF 图片
近期winform 做的一个截取屏幕的软件给大家!谁要留言给我哦! sss
- msfvenom的使用
msfvenom也只metasploit中的一个很强的工具,msfvenom生成木马非常的迅速可以各种版本的木马 该工具由msfpaylod和msfencodes的组成 生成木马是需要在本地监听,等待 ...
- 【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)
概念简介 Paxos是一种基于消息传递具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一. 发展历史 Paxos算法的发展历史追溯到古希腊,当时有一个名为"Pax ...
- linux中查看用户和组信息小结
查看当前登录用户的组内成员groups 查看当前登录用户名whoami 查看tom用户所在的组,以及组内成员groups tom 查看所有的用户信息cat /etc/passwd 用户名.密码.用户i ...
- 分库分表ShardingJDBC最佳实践
1 添加依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId> ...
- dart基础---->函数传值
1. string type main(List<String> args) { String name = "huhx"; changIt(name); print( ...
- MarkdownStudy03JDK
卸载JDK 删除jdk文件夹 删除配置环境(计算机>属性>高级>系统变量中的JAVA_HOME和Path) 删除JAVA_HOME环境变量 删除path环境变量 用dos窗口查看是否 ...
- API网关:开源Apinto网关快速入门
Apinto网关基于GO语言模块化开发,5分钟极速部署,配置简单.易于维护,支持集群与动态扩容,开箱即用.Apinto除了提供丰富的网关插件外,还提供监控告警.用户角色等扩展应用,同时支持自定义网关插 ...
- 驱动开发:探索DRIVER_OBJECT驱动对象
本章将探索驱动程序开发的基础部分,了解驱动对象DRIVER_OBJECT结构体的定义,一般来说驱动程序DriverEntry入口处都会存在这样一个驱动对象,该对象内所包含的就是当前所加载驱动自身的一些 ...