Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 矩形余度的最小周长_Java_Algorithm - Fatal编程技术网

Java 矩形余度的最小周长

Java 矩形余度的最小周长,java,algorithm,Java,Algorithm,这就是任务: 给出一个整数N,表示某个矩形的面积 边长为a和B的矩形的面积为a*B,周长为2*(a+B) 目标是找到任何面积等于N的矩形的最小周长。该矩形的边应仅为整数 例如,给定整数N=30,区域30的矩形为: (1, 30), with a perimeter of 62, (2, 15), with a perimeter of 34, (3, 10), with a perimeter of 26, (5, 6), with a perimeter of

这就是任务:

给出一个整数N,表示某个矩形的面积

边长为a和B的矩形的面积为a*B,周长为2*(a+B)

目标是找到任何面积等于N的矩形的最小周长。该矩形的边应仅为整数

例如,给定整数N=30,区域30的矩形为:

    (1, 30), with a perimeter of 62,
    (2, 15), with a perimeter of 34,
    (3, 10), with a perimeter of 26,
    (5, 6), with a perimeter of 22.
编写一个函数:

int solution(int N); 
给定一个整数N,返回任意矩形的最小周长,该矩形的面积正好等于N

例如,给定一个整数N=30,函数应该返回22,如上所述

假设:

    N is an integer within the range [1..1,000,000,000].
复杂性:

    expected worst-case time complexity is O(sqrt(N));
    expected worst-case space complexity is O(1).
这是我对Codibility task
MInPerimeterRectangle
的解决方案。它可以正常工作,但是如果我们有一个测试用例:“982451653”,编译器会得到一个
超时错误。这是因为这个矩形的最小周长是由边A=1和边B=982451653创建的

所以我有一个问题。是否有可能使解决方案更快

class Solution {
        public int solution(int N) {
            
            int A = 0;
            int B = N;
            int perimeter = 0;
            for (A = 1; A <= B; A++) {
                if (A * B == N){
                    perimeter = 2 * (A + B);
                    System.out.println("perimeter: " + perimeter);
                }
                if (N % (A+1) == 0) 
                    B = N/(A+1);
            }
            System.out.println("A: " + A);
            
            return perimeter;
        }
        
    }
类解决方案{
公共int解决方案(int N){
int A=0;
int B=N;
整数周长=0;

对于(A=1;A让l1和l2为边的长度。更简洁的是,最小化
|l1-l2 |
将最小化周长。因此,这将是一个解决方案:

public int solution(int n) {
    int sumMin =Integer.MAX_VALUE;
    for(int i=1 ;i<=Math.sqrt(n);i++) {
        if(n%i==0 ) {
            if(2*(i+n/i) < sumMin) sumMin=2*(i+n/i);    
        }   
    }   
    return sumMin;
}
public int解决方案(int n){
int sumMin=整数最大值;

对于(int i=1;i我不知道你说的使这个解决方案更快是什么意思。任何改变它的东西都会使它不再这个解决方案

您的根本问题是溢出。请改用
long


您的下一个问题是,您正在查找过多的
A
值。只有找到
N
中大于
sqrt(N)
的第一个因子,循环才会退出。但是,如果
N
是素数,这意味着您的算法是
O(N)
。我建议重新考虑你的方法。微积分告诉我们最小周长是一个正方形,因此这意味着你需要最接近
sqrt(N)的
N
因子
。因此,您希望找到一种有效的方法来生成
N的因子,并从那里开始。

在这种情况下,您的因子非常接近int的最大范围。我不完全确定您试图实现的是什么。您有原始规范的链接吗?这里的任何人怎么知道您的co有什么问题de如果你不提供你正在解决的问题?你是对的。我编辑了我的帖子。我认为这个问题更适合代码审查社区。这当然是正确的解决方案,但我想知道是否有可能使我的解决方案更快。这不是通过编辑你的代码使它更快,直到它看起来像这样吗?:PY你可以用另一种方式扫描,只返回遇到的第一个除数。你是不是把事情看得有点过于字面化了?当然,他的意思不是“这个解决方案”。尽管让你自己拥有一台更快的计算机会让“这个解决方案”更快。