问题描述:给定一个数字,返回一个由两个数字构成的数组。要求第一个数字大于第二个数字,且两个数字尽可能小。
思路:通过sqrt开方缩小遍历范围。
原答案:
public int[] constructRectangle(int area) {
int[] res=new int[2];
Double begin=Math.sqrt(area);
for(int i=begin.intValue();i<area;i++){
if(area%i==0){
int width=area/i;
if(width>i){
res[0]=width;
res[1]=i;
return res;
}else{
res[0]=i;
res[1]=width;
return res;
}
}
}
res[0]=area;
res[1]=1;
return res;
}
最佳答案:
public int[] constructRectangle(int area) {
int w = (int)Math.sqrt(area);
while( area%w != 0 ) w--;
return new int[]{ area/w, w };
}
很简洁,其次,由开方向下遍历要比由开方向上遍历要快。将原答案修改后如下:
public int[] constructRectangle(int area) {
int[] res=new int[2];
Double begin=Math.sqrt(area);
for(int i=begin.intValue();i>1;i--){
if(area%i==0){
int width=area/i;
res[0]=width;
res[1]=i;
return res;
}
}
res[0]=area;
res[1]=1;
return res;
}
运行时间上已经和最佳答案一致了。