Java併發篇-全面解析Executor框架
阿新 • • 發佈:2020-11-17
1. 題目描述
假設有打亂順序的一群人站成一個佇列。 每個人由一個整數對(h, k)表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。 編寫一個演算法來重建這個佇列。
注意:
總人數少於1100人。
示例
輸入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
輸出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
2. 解題思路
先排序後插入
1. 排序規則:按照先H高度降序,k個數升序排序。
2. 遍歷排序後的陣列,根據k插入到k的位置上。
2.1 C++
1 class Solution { 2 public: 3 4 vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { 5 // 根據自定義比較方法排序 6 sort(people.begin(), people.end(), [](const vector<int>& u, const vector<int>& v) { 7 return u[0] > v[0] || (u[0] == v[0] && u[1] < v[1]); 8 }); 9 // list是連結串列實現,插入效率更高 10 vector<vector<int>> ans; 11 // 遍歷元素 12 for(const vector<int>& p : people) { 13 //根據k來重新插入排序 14 ans.insert(ans.begin() + p[1], p); 15 } 16 return ans; 17 } 18 };
2.2 Java
第一種方法
1 class Solution { 2 3 // 第一種方法 4 /** 5 * 解題思路:先排序後插入 6 * 1.排序規則:按照先H高度降序,k個數升序排序 7 * 2.遍歷排序後的陣列,根據k插入到K的位置上 8 * 核心思想:高個子先站位,矮個子插入到K位置上,前面肯定有k個高個子,矮個子再插入前面也滿足k的要求 9 */ 10 /*** 11 Arrays.sort(people, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]); 12 13 LinkedList<int[]> list = new LinkedList<>(); 14 for (int[] i : people) { 15 list.add(i[1], i); 16 } 17 18 return list.toArray(new int[list.size()][2]); 19 */ 20 }
第二種方法
1 class Solution { 2 // 第二種方法 3 // 1.挖坑填數 4 private int adjustArray(int[][] arr, int l, int r) { 5 int[] p = arr[l]; 6 while(l < r) { 7 // 從右開始找第一個 H_j大於或等於H_i,且k_j小於等於k_i的值 8 while(l < r) { 9 if(arr[r][0] > p[0] || arr[r][0] == p[0] && arr[r][1] < p[1]) { 10 // 用arr[j]填到arr[i], 11 arr[l++] = arr[r]; 12 break; 13 } 14 r--; 15 } 16 while(l < r) { 17 if(arr[l][0] < p[0] || arr[l][0] == p[0] && arr[l][1] > p[1]) { 18 arr[r--] = arr[l]; 19 break; 20 } 21 l++; 22 } 23 } 24 // 退出時,i=j,將p填到這個坑來 25 arr[l] = p; 26 return l; 27 } 28 // 2.分治 29 private void quickSort(int[][] arr, int left, int right) { 30 if (left >= right) 31 return; 32 int i = adjustArray(arr, left, right); 33 quickSort(arr, left, i - 1); 34 quickSort(arr, i + 1, right); 35 } 36 37 public int[][] reconstructQueue(int[][] people) { 38 quickSort(people, 0, people.length - 1); 39 List<int[]> list = new ArrayList<>(); 40 for (int[] p: people) list.add(p[1], p); 41 return list.toArray(new int[0][2]); 42 } 43 }
2.3 Python
1 class Solution: 2 def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]: 3 res = [] 4 people = sorted(people, key = lambda x : (-x[0], x[1])) 5 for p in people: 6 # if len(res) <= p[1]: 7 # res.append(p) 8 # else: 9 res.insert(p[1], p) 10 return res
3. 結語
努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!
如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。