题目链接
    image.png
    牛顿迭代公式:
    image.pngimage.png

    1. class Solution {
    2. public int arrangeCoins(int n) {
    3. // return arrangeCoins1(n);
    4. return arrangeCoins2(n);
    5. // return arrangeCoins3(n);
    6. }
    7. // 1.迭代
    8. public int arrangeCoins1(int n) {
    9. int num = 1;
    10. while(num <= n) {
    11. n = n - num;
    12. num ++;
    13. }
    14. if(num == n) return n;
    15. return num-1;
    16. }
    17. // 2.二分查找(因为不满足的行数一定是小于n的,所以。。), 前x项和为:(1+x)*(x/2)
    18. public int arrangeCoins2(int n) { // int类型的范围
    19. int left = 1,right = n;
    20. while(left <= right) {
    21. int mid = (right - left)/2 + left;
    22. long num = (long)(mid+1)*mid;
    23. if(num == (long)2*n) {
    24. return mid;
    25. } else if(num > (long)2*n) {
    26. right = mid - 1;
    27. } else {
    28. left = mid + 1;
    29. }
    30. }
    31. return left-1;
    32. }
    33. // 3.牛顿迭代, 1804289383过不去,会发生栈溢出
    34. public int arrangeCoins3(int n) {
    35. if(n == 0) return 0;
    36. return (int)sqrt(n,n);
    37. }
    38. private double sqrt(double x, int n) {
    39. double res = (x + (2*n - x)/x)/2;
    40. if(res == x) {
    41. return res;
    42. } else {
    43. return sqrt(res,n);
    44. }
    45. }
    46. }