1. 程式人生 > >leetcode (Sqrt(x))

leetcode (Sqrt(x))

Title:Sqrt(x)     69

Difficulty:Easy

原題leetcode地址:  https://leetcode.com/problems/sqrtx/

 

1.  從1開始遍歷,如果平方小於x,則繼續,否則相等的話,直接返回i,否則大於,直接返回i-1(注意i*i可能溢位int)

時間複雜度:O(n),一次一層for迴圈。

空間複雜度:O(1),沒有申請額外空間。

    /**
     * 從1開始遍歷,如果平方小於x,則繼續,否則相等的話,直接返回i,否則大於,直接返回i-1
     * @param x
     * @return
     */
    public static int mySqrt(int x) {

        if (x <= 0) {
            return 0;
        }

        int result = 0;

        for (long i = 1; i <= x / 2; i++) {
            if (i * i < x) {
                continue;
            }
            else {
                if (i * i == x) {
                    result = (int)i;
                    break;
                }
                else {
                    result = (int)i - 1;
                    break;
                }
            }

        }

        return result;

    }

2. 二分法,注意mid*mid可能溢位int

時間複雜度:O(logn),一次一層while迴圈。

空間複雜度:O(1),沒有申請額外空間。

    /**
     * 二分法
     * @param x
     * @return
     */
    public static int mySqrt1(int x) {

        if (x <= 0) {
            return 0;
        }

        int start = 0;
        int end = x;

        while (start <= end) {
            long mid = (start + end) / 2;
            if (mid * mid < x) {
                start = (int)mid + 1;
            }
            else if (mid * mid > x) {
                end = (int)mid - 1;
            }
            else {
                return (int)mid;
            }
        }

        return end;

    }