package demo; public class 排序硬币 { public static void main(String[] args) { System.out.println(sortCoins1(10)); System.out.println(sortCoins2(10)); System.out.println(sortCoins3(10)); } /** * 暴力算法 迭代 * * @param n * @return */ private static int sortCoins1(int n) { for (int i = 1; i <= n; i++) { n -= i; if (n <= i) { return i; } } return 0; } /** * 使用二分查找 * * @param n * @return */ private static int sortCoins2(int n) { int low = 0, high = n; while (low <= high) { int mid = (high - low) / 2 + low; int coins = ((mid + 1) * mid) / 2; if (n == coins) { return mid; } else if (coins > mid) { high = mid--; } else { low = mid++; } } return high; } /** * 牛顿迭代 * * @param n * @return */ private static int sortCoins3(int n) { if (n == 0) { return 0; } return (int) sqrtCoin(n, n); } /** (2 * n - x)的 由来: 因为求的是 x^2+x=2n 所以求解得 x^2=2n-x * 牛顿迭代算法(x+n/x)/2 就是求n的平方根 这里的话 把x^2 换成了公式中的n * @param x * @param n * @return */ private static double sqrtCoin(double x, int n) { double res = (x + (2 * n - x) / x) / 2; if (res==x){ return x; }else { return sqrtCoin(res,n); } } }
排序硬币算法
最新推荐文章于 2021-09-18 11:41:58 发布