1. 程式人生 > 實用技巧 >Java併發篇-全面解析Executor框架

Java併發篇-全面解析Executor框架

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. 結語

努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!

如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。