剑指OFFER 面试题14(动态规划和贪婪算法): 剪绳子 (JAVA)

面试题14:剪绳子
题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。

动态规划:用动态规划从上往下分析问题,从下往上解决问题。空间复杂度为O(n),时间复杂度为O(n^2)

贪婪算法:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。在剪绳子中,如果绳子的长度大于5,则每次剪出的长度为3的绳子。如果剩下的长度仍然大于5,则接着剪出一段长度为3的绳子,重复这个步骤,直到剩下的长度小于5.时间和空间复杂度都为O(1)。

代码

public class CuttingRope {
	
	public static int maxproduct(int length) {//动态规划
		if (length<2) {return 0;}
		if (length==2) {return 1;}
		if (length==3) {return 2;}
		
		int[] products=new int [length+1];
		products[0]=1;
		products[1]=1;
		products[2]=2;
		products[3]=3;
		
		
		for (int i=4;i<=length;i++) {
			int max=0;
			for(int j=1;j<=i/2;j++) {
				int product=products[j]*products[i-j];
				if (max<product) {
					max=product;
					}
				products[i]=max;
			}			
		}
		return products[length];		
	}
	public static int maxproduct1(int length) {//贪婪算法
		if (length<2) {return 0;}
		if (length==2) {return 1;}
		if (length==3) {return 2;}
		int timesof3=length/3;
		if(length-timesof3*3==1) {timesof3 -=1;}
		int timesof2=(length-timesof3*3)/2;
		int maxproduct1=(int) (Math.pow(3, timesof3)* Math.pow(2, timesof2));
		return maxproduct1;	
		
	}
	
	public static void main(String[] args) {
		int length=10;
		int result1 = maxproduct(length);//动态规划的解
		int result2 = maxproduct1(length);//贪婪算法的解
		System.out.println(result1);
		System.out.println(result2);
	}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值