算法18-超级洗衣机问题

题目:
给定一个数组代表每一台洗衣机里面目前有几件衣服,要求每一台洗衣机的衣服都相等,所以衣服多的要向少的移动,但每次只能向邻近的洗衣机左右,求最少移动几轮可以实现相等,

分析:

将某个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()转换一下,但是有小数的术后会损失精度 ,要注意

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值