微软等面试100题系列 - 45(2)



2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3

package com.interview.algorithm;

public class LeverageSum {
	/*
	 * 2、.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
			  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; 
			  {3,6}{2,4,3} m=2
			  {3,3}{2,4}{6} m=3 所以m的最大值为3
	 */
	public int[] a;
	 
	public void getFactors(){
		/*
		 * 优化排序后,拿到最大值
		 */
		int len = a.length;
		int eachSum;
		int sum = 0;
		int[] res = new int[len];
		int groupId = 1;
		int index = 0;
		for(int i=0; i < len; i++){
			sum += a[i];
		}
		for(int m = 2; m <= len; m++){
			if(sum%m != 0) continue;
			eachSum = sum/m;
			if(this.findFactorArray(eachSum, eachSum, m, res, groupId)){
				for(int i = 0; i < res.length; i++){
					System.out.print(res[i]+",");
				}
				System.out.println();				
			}
			this.clearArray(res);
			
		}
		
	}
	int  returnVlaue;
	public static int NonFound = 1;
	public static int lessThanZero = 2;
	public boolean findFactorArray(int eachSum, int groupSum, int m, int[] res, int groupId ){

		
		if(groupSum < 0) return false;
		if(groupSum == 0){
			groupId ++;
			groupSum = eachSum;
			if(groupId == m+1){
				return true;
			}
		}
		
		
		
		for(int i = 0; i<a.length; i++){
			if(res[i] != 0 ) continue;
				res[i] = groupId;
				if (this.findFactorArray(eachSum, groupSum - a[i], m, res, groupId))
					return true;
				res[i] = 0;
		}
			
		return false;
	}
	
	public void clearArray(int[] a){
		for(int i = 0; i < a.length ; i++){
			a[i] = 0;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] temp = {3,2,4,3,6};
		LeverageSum leverage  = new LeverageSum();
		leverage.a = temp;
		leverage.getFactors();
	}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值