###### Agenda: ###### 11/01 22:00(UTC+8) 11/01 07:00(UTC-7) ###### 公布這次live session題目 ###### 11/01 22:30(UTC+8) 11/01 07:30(UTC-7) ###### 開始逐步給hint ###### 11/01 23:00(UTC+8) 11/01 08:00(UTC-7) ###### 題解 + Q&A ###### 還沒有加入DC伺服器的請記得加入,並去查看#學員驗證頻道進行驗證才可以看到live session的討論區https://discord.gg/WUE3XutPK3 --- #### 本周題目 #### Leetcode 1002 #### https://leetcode.com/problems/find-common-characters/description/ #### Leetcode 1042 #### https://leetcode.com/problems/flower-planting-with-no-adjacent/description/ --- ### Hint - Leetcode 1002 : - hint 1: 順序不影響答案 ---- ### Hint - Leetcode 1002 : - hint 1: 順序不影響答案 - hint 2: 先思考單一一種字母 ---- ### Hint - Leetcode 1002 : - hint 1: 順序不影響答案 - hint 2: 先思考單一一種字母 - hint 3: 當一個字母出現多次的時候需要找出最小出現的次數 ---- ### Hint - Leetcode 1002 : - hint 1: 順序不影響答案 - hint 2: 先思考單一一種字母 - hint 3: 當一個字母出現多次的時候需要找出最小出現的次數 - hint 4: 這題可以做到 $O(\sum_{word\in words} |word|),也就是所有word長度的總和 --- ### Hint - Leetcode 1042 : - hint 1: 考慮換一個方式存圖 ---- ### Hint - Leetcode 1042 : - hint 1: 考慮換一個方式存圖 - hint 2: 當要種花在一個花園還時,要確認周圍已經種過花的花園,不要跟他們衝突 ---- ### Hint - Leetcode 1042 : - hint 1: 考慮換一個方式存圖 - hint 2: 當要種花在一個花園還時,要確認周圍已經種過花的花園,不要跟他們衝突 - hint 3: 一個花園最多只有三個鄰居,但有四種花可以選 ---- ### Hint - Leetcode 1042 : - hint 1: 考慮換一個方式存圖 - hint 2: 當要種花在一個花園還時,要確認周圍已經種過花的花園,不要跟他們衝突 - hint 3: 一個花園最多只有三個鄰居,但有四種花可以選 - hint 4: 當一個點種過花後就不要再去更動 --- ### 題解 ---- ### Leetcode 1002 題目 - 給一些字串,找出他們共同出現的字母,一個字母可能出現多次。 ---- ### Leetcode 1002 - 對於每一個 word ,我們建立出他的 counting sort array ,也就是當a出現兩次,我們就在array[0]上設定為2 - 將這些 couting sort array 蒐集起來,對每一個位子找出所有counting sort array中最小的 - $counting1 = \{1,2,3...\}$ - $counting2 = \{3,2,1...\}$ - $ans = \{1,2,1...\}$ ---- ### LeetCode 1002 java code ```java public List<String> commonChars(String[] words) { int ans[] = new int[26]; for (int i = 0; i < 26; i++) { ans[i] = Integer.MAX_VALUE; } for (String word : words) { int cnt[] = new int[26]; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); cnt[c - 'a']++; } for (int i = 0; i < 26; i++) { ans[i] = Math.min(ans[i], cnt[i]); } } List<String> res = new ArrayList<String>(); for (int i = 0; i < 26; i++) { for (int j = 0; j < ans[i]; j++) { res.add(String.valueOf((char) (i + 'a'))); } } return res; } ``` ---- ### Test case - 一個字串 - 多個字串但答案都從同一個來 - "abc" "aabbcc" "aaabbbccc" - 多個字串但答案從不同地方來 - "aaabbc" "abbbcc" "aabccc" ---- ### Leetcode 1042 題目 - 給一些花園,某些花園互為鄰居,一個花園最多只會有 $3$ 個鄰居,現在有四種花,請給每個花園決定一種花,使得任兩個互為鄰居的花園的花是不同的。 ---- ### Leetcode 1042 題目 - 轉換題目後變成,給一張圖,每一個點最多有 $3$ 條邊,有四種顏色要將點塗色,且塗完後,每條邊的兩個點為不同顏色 ---- ### Leetcode 1042 題目 - ![image](https://hackmd.io/_uploads/rJacEY_0gl.png) - [1,2,1,3] ---- ### Leetcode 1042 解法 - 由於每個點最多只連接到三個點,就算他那三個點都是不一樣的顏色,該點也會剩餘一種顏色可以填。 - 想辦法走完整張圖,在填每個點的顏色時,注意不要跟他已經填過顏色的鄰居衝突就可以了。 ---- ### Leetcode 1042 dfs part ```java void dfs(int u, int[] ans, List<Integer>[] edge) { int[] vis = new int[5]; for (int v : edge[u]) { vis[ans[v]] = 1; } for (int i = 1; i <= 4; i++) { if (vis[i] == 0) { ans[u] = i; break; } } for (int v : edge[u]) { if (ans[v] == 0) { dfs(v, ans, edge); } } } ``` ---- ### Leetcode 1042 main part ```java public int[] gardenNoAdj(int n, int[][] paths) { List<Integer>[] edge = new ArrayList[n]; for (int i = 0; i < n; i++) { edge[i] = new ArrayList<Integer>(); } for (int[] path : paths) { edge[path[0] - 1].add(path[1] - 1); edge[path[1] - 1].add(path[0] - 1); } int[] ans = new int[n]; for (int i = 0; i < n; i++) { if (ans[i] == 0) { dfs(i, ans, edge); } } return ans; } ``` ---- ### Test case - 圖沒有連通 - 大小為四的完全圖 - ![image](https://hackmd.io/_uploads/BkrEqF_Rgl.png) - 有點沒有鄰居 ---- ### 幫忙填寫個回饋問卷讓我們變得更好 - https://forms.gle/7oxfBE4LCbuKaWkx5 - ![image](https://hackmd.io/_uploads/rkkGaY_0xe.png)
{"title":"1101 live session","description":"Leetcode 1390 :","contributors":"[{\"id\":\"214a576a-9d94-453a-a11d-248251d46d4e\",\"add\":11631,\"del\":7493,\"latestUpdatedAt\":1762054764894}]"}
    125 views