1. 程式人生 > >leetcode (Maximize Distance to Closest Person)

leetcode (Maximize Distance to Closest Person)

Title:Maximize Distance to Closest Person   849

Difficulty:Easy

原題leetcode地址:https://leetcode.com/problems/maximize-distance-to-closest-person/

 

1.  見程式碼中的註釋

時間複雜度:O(n),多次一層for迴圈,需要遍歷整個陣列。

空間複雜度:O(n),最長申請長度為n-1的List。

    /**
     * 1、計算第一個位置的數為0與後面出現的第一個1的距離
     * 2、計數最後一個位置的數為0與前面出現的第一個1的距離,保留較大的那個值
     * 3、將出現1的位置儲存到List中,計算List中相鄰的兩個數差的絕對值,然後除以2儲存到另一個List中
     * 4、計算上述List中的最大值,然後同上面的較大值對比
     * @param seats
     * @return
     */
    public static int maxDistToClosest(int[] seats) {

        List<Integer> list = new ArrayList<>();
        int startCount = 0;
        int endCount = 0;

        if (seats[0] == 0) {
            for (int i = 1; i < seats.length; i++) {
                if (seats[i] == 1) {
                    startCount = i - 0;
                    break;
                }
            }
        }

        if (seats[seats.length - 1] == 0) {
            for (int i = seats.length - 2; i >= 0; i--) {
                if (seats[i] == 1) {
                    endCount = seats.length - 1 - i;
                    break;
                }
            }
        }

        int maxCount = Math.max(startCount, endCount);

        for (int i = 0; i < seats.length; i++) {
            if (seats[i] == 1) {
                list.add(i);
            }
        }

        List<Integer> tmpList = new ArrayList<>();

        for (int i = 0; i < list.size() - 1; i++) {
            tmpList.add(Math.abs(list.get(i + 1) - list.get(i)) / 2);
        }

        int max = Integer.MIN_VALUE;

        for (int i = 0; i < tmpList.size(); i++) {
            if (tmpList.get(i) > max) {
                max = tmpList.get(i);
            }
        }

        return Math.max(max, maxCount);

    }

1.  見程式碼中的註釋

時間複雜度:O(n),多次一層for迴圈,需要遍歷整個陣列。

空間複雜度:O(n),最長申請長度為n的陣列。

    /**
     * 最近人的最大距離(最近--最小 MIN,最大--最大 MAX)
     * 1、求兩側到1的距離問題,分別生成lef、right陣列,分別記錄到左側1的距離和距離右側1的距離
     * 2、因為先求最小值,陣列的開頭和結尾可能是0,在初始化陣列的時候沒需要對left和right的值為資料的長度
     * 3、分別對陣列進行從左到右、從右到左遍歷,如果當前值為1,此時left[i]和right[i]置為1,否則對之前(後)的數加1操作
     * 4、求最小值,再球最大值
     * @param seats
     * @return
     */
    public static int maxDistToClosest1(int[] seats) {

        int left[] = new int[seats.length];
        int right[] = new int[seats.length];
        for (int i = 0; i < seats.length; i++) {
            left[i] = seats.length;
            right[i] = seats.length;
        }

        for (int i = 0; i < seats.length; i++) {
            if (seats[i] == 1) {
                left[i] = 0;
            }
            else if (i > 0) {
                left[i] = left[i - 1] + 1;
            }
        }

        for (int i = seats.length - 1; i >= 0; i--) {
            if (seats[i] == 1) {
                right[i] = 0;
            }
            else if (i < seats.length - 1) {
                right[i] = right[i + 1] + 1;
            }
        }

        for (int i = 0; i < seats.length; i++) {
            System.out.print(left[i] + " ");
            // System.out.print(right[i] + " ");
        }

        int max = Integer.MIN_VALUE;

        for (int i = 0; i < seats.length; i++) {
            if (seats[i] == 0) {
                max = Math.max(max, Math.min(left[i], right[i]));
            }
        }

        return max;

    }