题目:
给定一个数组代表每一台洗衣机里面目前有几件衣服,要求每一台洗衣机的衣服都相等,所以衣服多的要向少的移动,但每次只能向邻近的洗衣机左右,求最少移动几轮可以实现相等,
分析:
将某个index的位置单独来看,它的左右两边分别看成两个整体,左边整体得出一个数表示多出还是缺少几件衣服,右边同样求出多出还是缺少衣服件数
那么两边的数据一共由上面四种case,前三种去绝对值大的数,第四种将绝对值相加,得到某一个节点的最少步骤,同理求出所有节点的最少步骤,返回最大值即可
代码:
package main
import(
"fmt"
"math"
)
// list:=[]int{4,7,9,10,7,15,20,33,24,11}
func process(list []int)int{
minstep:=0
sum:=getcount(list,0,len(list))
if sum % len(list)!=0{
return -1
}
left,right:=0,0
mid:=sum/len(list)
for i:=1;i<len(list)-1;i++{
left=getcount(list,0,i)
right=getcount(list,i+1,len(list))
disleft:=left-mid
disright:=right-mid
fmt.Println(left,right)
fmt.Println(mid,disleft,disright)
tmp:=0
if disleft<0 && disright<0{
tmp=int(math.Abs(float64(disleft))+math.Abs(float64(disright)))
}else{
tmp=func(disleft,disright int)int{
if int(math.Abs(float64(disleft)))>int(math.Abs(float64(disright))){
return int(math.Abs(float64(disleft)))
}else{
return int(math.Abs(float64(disright)))
}
}(disleft,disright)
}
if tmp>minstep{
minstep=tmp
}
}
return minstep
}
func getcount(list []int,L,R int)int{
sum:=0
for i:=L;i<R;i++{
sum+=list[i]
}
return sum
}
func main(){
list:=[]int{4,7,9,10,7,15,20,33,35,0}
fmt.Println(process(list))
}
总结:
1 math.Abs接受float64型,传入int参数用flost64()转换一下,但是有小数的术后会损失精度 ,要注意