###### Agenda:
###### 10/18 22:00(UTC+8) 10/18 07:00(UTC-7)
###### 公布這次live session題目
###### 10/18 22:30(UTC+8) 10/18 07:30(UTC-7)
###### 開始逐步給hint
###### 10/18 23:00(UTC+8) 10/18 08:00(UTC-7)
###### 題解 + Q&A
###### 還沒有加入DC伺服器的請記得加入,並去查看#學員驗證頻道進行驗證才可以看到live session的討論區https://discord.gg/WUE3XutPK3
---
#### 本周題目
#### Leetcode 1390
#### https://leetcode.com/problems/four-divisors/description/
#### Leetcode 1482
#### https://leetcode.com/problems/minimum-number-of-days-to-make-m-bouquets/description/
---
### Hint
- Leetcode 1390 :
- hint 1: 如何窮舉出一個數的所有因數
----
### Hint
- Leetcode 1390 :
- hint 1: 如何窮舉出一個數的所有因數
- hint 2: 想一想因數的性質
----
### Hint
- Leetcode 1390 :
- hint 1: 如何窮舉出一個數的所有因數
- hint 2: 想一想因數的性質
- hint 3: 因數大部分都是兩兩一對出現的
----
### Hint
- Leetcode 1390 :
- hint 1: 如何窮舉出一個數的所有因數
- hint 2: 想一想因數的性質
- hint 3: 因數大部分都是兩兩一對出現的
- hint 4: 想一想因數比較小的那個的範圍
---
### Hint
- Leetcode 1482 :
- hint 1: 題目說明須要連續的花朵,若有連續x朵花朵,可以產生幾個花束呢
----
### Hint
- Leetcode 1482 :
- hint 1: 題目說明須要連續的花朵,若有連續x朵花朵,可以產生幾個花束呢
- hint 2: 假設已經知道哪幾朵花有開,能不能判斷答案呢
----
### Hint
- Leetcode 1482 :
- hint 1: 題目說明須要連續的花朵,若有連續x朵花朵,可以產生幾個花束呢
- hint 2: 假設已經知道哪幾朵花有開,能不能判斷答案呢
- hint 3: 假設現在改成問第幾天能產生多少花束,要如何做呢。
----
### Hint
- Leetcode 1482 :
- hint 1: 題目說明須要連續的花朵,若有連續x朵花朵,可以產生幾個花束呢
- hint 2: 假設已經知道哪幾朵花有開,能不能判斷答案呢
- hint 3: 假設現在改成問第幾天能產生多少花束,要如何做呢。
- hint 4: 時間越晚,則越有機會完成所有花束,若現在在第d天,則bloomDay<=d的花有開,其他的花沒有開
---
### 題解
----
### Leetcode 1390 題目
- 給你一個array,找出array中的數字滿足它的因數數量剛好為4個,並計算他們的所有因數總和
----
### Leetcode 1390 題目
- 考慮單一一個數字,因為因數都是兩兩成對出現的,比較小的那個因數會$\leq \sqrt n$,因此只要窮舉到$\sqrt n$就可以得到所有的因數。
- 單一一個數字檢查時間為$O(\sqrt n)$,總體複雜度為$O(|nums|\sqrt n)$
- 注意兩個一樣的因數相乘
----
### Q1 java code
```java
public int sumFourDivisors(int[] nums) {
int res = 0;
for (int num : nums) {
int cnt = 0;
int sum = 0;
for (int i = 1; i * i <= num; i++) {
if (num % i == 0) {
cnt++;
sum += i;
if (num / i != i) {
cnt++;
sum += num / i;
}
}
}
if (cnt == 4) {
res += sum;
}
}
return res;
}
```
----
### Test case
- 只考慮一個數字
- 1 因數數量少於4
- 4 質數的平方
- 8 因數數量等於4
- 12 因數數量大於4
----
### Leetcode 1482 題目
- 給一個 array 裡面,每個位子為一朵花,array上的數字代表開花的日期。
- 需要準備 $m$ 個花束,每個花束為需要 $k$ 朵花,且這 $k$ 朵花在 array 上需要相鄰。
- 問最早要等到什麼時候才能準備好這 $m$ 個花束。
----
### Leetcode 1482 解法
- 用 binary search 去找出正確的時間。
- 搜尋一個值的時候,將開花日期早於這個時間的花當成$1$,其他當成$0$
- 找出這個 array 上所有連續的 $1$,假設有 $x$ 個連續的 $1$,則他們就可以完成 $\lfloor x/k\rfloor$ 個花束
- 因為只有有開花的日子才有意義,因此可以將有開花的日子蒐集起來排序,這樣複雜度就可以達到 $O(n\ log\ n)$
----
### Leetcode 1482
```java
public int minDays(int[] bloomDay, int m, int k) {
int[] days= new int[bloomDay.length];
for(int i = 0 ; i < bloomDay.length ; i++){
days[i] = bloomDay[i];
}
Arrays.sort(days);
int min = -1, max = bloomDay.length;
while(max - min > 1){
int mid = (max + min) / 2;
int cnt = 0;
int oneCount = 0;
for(int i = 0 ; i < bloomDay.length ; i++){
if(bloomDay[i] <= days[mid]) {
oneCount++;
} else {
oneCount = 0;
}
if(oneCount == k) {
cnt++;
oneCount = 0;
}
}
if(cnt >= m) {
max = mid;
} else {
min = mid;
}
}
if (max == bloomDay.length) {
return -1;
}
return days[max];
}
```
----
### Test case
- $m*n > |bloomDay|$
- $m*n == |bloomDay|$
- 前 m*k早開的花就可以達成條件
- [1,1,3,3,2,2] k=2 m=2
----
### Test case
- 前 m*k 早開的花就不能達成條件
- [1,3,1,3,2,2] k=2 m=2
- 過程中的array可能會有連續x個1但x不能被k整除
- [1,1,1,3,3] k=2 m=2
- 最佳答案卡在中間
- [3,1,1,1,3,3] k=3 m=1
- k=1 m=1 [2,1,3]
----
### 幫忙填寫個回饋問卷讓我們變得更好
- https://forms.gle/XLqty66ZYHYUDPmUA
- 
{"title":"1018 live session","description":"Leetcode 766 :","contributors":"[{\"id\":\"214a576a-9d94-453a-a11d-248251d46d4e\",\"add\":5558,\"del\":1421,\"latestUpdatedAt\":1761243999777}]"}