分析:
1)直接想法是穷举法,依次算出电梯停靠在第一层到第N层乘客所要爬的总层数,找出最小值。
代码(js版):
View Code
1 var nPerson = new Array(0, 2, 3, 5, 8); //nPerson[i]表示第i层下的人数; 2 3 var N = 10; //电梯能到达的最大层数; 4 5 var nMinFloor, nTargetFloor; //nMinFloor为最小总层数;nTargetFloor为电梯停在哪层最优; 6 7 8 //解法一:穷举法 [时间复杂度O(N^2)] 9 function exhaustion() 10 { 11 var nFloor; //nFloor临时变量,记录每次的总层数; 12 13 nTargetFloor = -1; 14 15 //穷举电梯在每一层停靠的结果,比较结果得出最优解; 16 for(var i=1; i<=N; i++) 17 { 18 nFloor = 0; 19 for(var j=1; j nFloor)) 35 { 36 nMinFloor = nFloor; 37 nTargetFloor = i; 38 } 39 40 } 41 42 alert("Minfloor acounts:"+ nMinFloor +", optTargetFloor:"+ nTargetFloor); 43 }
为降低时间复杂度,关键是减少嵌套for循环。
2)比较调整法(思路见注释)
View Code
体会: 1 //解法二:比较法 [时间复杂度O(N)] 2 /* 3 思路:当电梯停靠在第i层时,乘客所要爬的总的楼梯数为Y. 4 假设有N1个乘客要到达的层数 i. 5 所以有: 6 (1)当电梯改停在i-1,则 Y+(N2+N3-N1) 7 (2)当电梯改停在i+1,则 Y+(N1+N2-N3) 8 所以当后面那部分的值<0时(如(2)的N1+N2
对比了自己的代码和书上的代码才发现就算思路相同,但是书上的代码的优化质量和简洁度显然更高。
嘿嘿,“优秀的代码是不知不觉中写出来的”。
路漫漫。