leetcode (Maximize Distance to Closest Person)
阿新 • • 發佈:2018-12-06
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; }