我正在尝试编写一种算法,该算法将找到给定整数的最大完美平方,并尽可能快地每次从总数中减去它们的值。这有点难以解释,对于有点模棱两可的标题,我深表歉意,所以我将给出一些输入/输出示例:
- 输入:23
- 输出:[16、4、1、1、1]
- 解释:25 (5x5) 太大,但 16 (4x4) 适合。将其添加到数组中并从 23 (7) 中减去 16。下一个适合的最大完美正方形是 4 (2x2),因此将其添加到数组中并从 7 (3) 中减去 4。从这里开始,最大的完美正方形就是 1 (1x1)。所以将 1 添加到数组中,直到我们得到 0。
- 输入:13
- 输出:[9, 4]
- 解释: 9 (3x3) 是最大的正方形,因此将其添加到数组中并从 13 (4) 中减去。那么 4 也是一个完美的正方形,所以添加它并在那里结束。
我的解决方案如下(变量名称与向我提出问题的方式相关):
public static int[] solution(int startingSquareYards) {
ArrayList<Integer> largestSquares = new ArrayList<Integer>();
// Cast for use with Math. methods
double remainingSquareYards = (double) startingSquareYards;
while (remainingSquareYards > 0) {
double largestSquareRoot = Math.floor(Math.sqrt(remainingSquareYards));
// Edit - used to be:
// double yardsOfMaterialUsed = Math.pow(largestSquareRoot, 2);
double yardsOfMaterialUsed = largestSquareRoot * largestSquareRoot;
remainingSquareYards -= yardsOfMaterialUsed;
largestSquares.add((int) yardsOfMaterialUsed);
}
int[] solutionArray = largestSquares.stream().mapToInt(i -> i).toArray();
return solutionArray;
}
我正在征求对我的解决方案的意见,以及我是否可以以任何方式优化它以提高时间/空间复杂性、简单性(同时保持易于阅读/理解)等。它目前适用于我编写的所有测试,但我可能缺少边缘情况或需要改进的地方 - 输入的起始平方码可以在 1 到 1,000,000 之间。任何建设性的反馈表示赞赏:)
感谢您的关注!