1. 程式人生 > >126、構造矩形

126、構造矩形

題目描述
作為一位web開發者, 懂得怎樣去規劃一個頁面的尺寸是很重要的。 現給定一個具體的矩形頁面面積,你的任務是設計一個長度為 L 和寬度為 W 且滿足以下要求的矩形的頁面。要求:

  1. 你設計的矩形頁面必須等於給定的目標面積。

  2. 寬度 W 不應大於長度 L,換言之,要求 L >= W 。

  3. 長度 L 和寬度 W 之間的差距應當儘可能小。
    你需要按順序輸出你設計的頁面的長度 L 和寬度 W。

示例:

輸入: 4
輸出: [2, 2]
解釋: 目標面積是 4, 所有可能的構造方案有 [1,4], [2,2], [4,1]。
但是根據要求2,[1,4] 不符合要求; 根據要求3,[2,2] 比 [4,1] 更能符合要求. 所以輸出長度 L 為 2, 寬度 W 為 2。
說明:

給定的面積不大於 10,000,000 且為正整數。
你設計的頁面的長度和寬度必須都是正整數。

我的程式碼,直接使用一個前一個後指標進行計算即可,可喜的是一步就通過啦,可悲的是效率異常的低,哎

class Solution {
    public int[] constructRectangle(int area) {
        int [] result = new int[2];
		if(area  == 1){
			result[0] = 1;
			result[1] = 1;
			return result;
		}
		int length = area;
		int width = 1;
		int gap = length - width;
		result[0] = length;
		result[1] = width;
		while (length >= width) {
			if(length * width == area){
				if(length - width < gap){
					gap = length - width;
					result[0] = length;
					result[1] = width;
				}
				length --;
				width ++;
			}
			if(length * width > area){
				length --;
			}
			if(length * width < area){
				width ++;
			}
			
		}
		
		
		return result;
    }
}

排名靠前的程式碼,直接從中點進行查詢,不得不說這樣的演算法很精妙

class Solution {
    public int[] constructRectangle(int area) {
        int W = (int)Math.sqrt(area);
        while(W>=1){
            if(area%W == 0)
                break;
            W--;
        }
        int L = area/W;
        int[] nums = {L, W};
        return nums;
    }
}

自己嘗試實現一遍

class Solution {
    public int[] constructRectangle(int area) {
                
        int [] result = new int[2];
		if(area  == 1){
			result[0] = 1;
			result[1] = 1;
			return result;
		}
		int mid = (int) Math.sqrt(area);
		while (mid >= 1) {
			if(area % mid == 0){
				result[1] = mid;
				result[0] = area / mid;
				break;
			}else {
				mid--;
			}
		}
		
		return result;
    }
}