LeetCode 第 202 場周賽 題解

2021-10-09 05:44:21 字數 3194 閱讀 1466

思路:暴力

簽到題,暴力遍歷即可。

**:

class solution 

}return false;

}};

複雜度分析:

遍歷陣列,時間複雜度o(n);

沒有使用額外變數,空間複雜度為o(1)

思路:數學

根據題意,可以直接將陣列以中心元素為對稱點,兩兩配對,操作的次數相同。所以只需要針對陣列長度奇偶進行分析即可。

實現細節:

我們假設 n 為奇數,不妨設 n = 2k + 1,那麼我們可以將陣列分為如下三段:第一段為a[1] - a[k],第二段為單獨乙個元素a[k + 1],第三段為a[k + 2] - a[2k + 1](注意這裡使用的下標元素是從1開始,便於理解,下同)。根據題意,我們可以將 a[1] 與 a[2k + 1]配對,二者同時操作 2k 次,即可達到值相等;同理,將a[2] 與 a[2k]配對,二者同時操作 2k - 2次即相等。以此類推,a[k + 1]不需要變換值,單獨作為一組。故總共需要操作的次數為:

2 +4

+...

+2k=

k∗(k

+1)=

(n−1

)(n+

1)

42 + 4 + ... + 2k = k * (k + 1) = \frac

2+4+..

.+2k

=k∗(

k+1)

=4(n

−1)(

n+1)

​ 同理,若 n 為偶數,不妨設 n = 2k,可以將陣列分為兩段:第一段為 a[1] - a[k],第二段為a[k + 1] - a[2k],此時,a[1] 與 a[2k]配對,二者同時操作 2k - 1次,a[3] 與 a[2k - 1]配對,二者同時操作 2k - 3次,以此類推,a[k] 與 a[k + 1] 配對,二者同時操作1次,故總共需要操作的次數為:

1 +3

+...

+2k−

1=k2

=n24

1 + 3 + ... + 2k - 1 = k^2 = \frac

1+3+..

.+2k

−1=k

2=4n

2​**:

class solution  else 

}};

複雜度分析:

時間、空間複雜度均為o(1)

思路:二分搜尋

題意求最大化最小,類似這樣的求最大化最小值、最小化最大值等都可以用二分搜尋解決。

實現細節:

首先要找到二分搜尋的邊界,根據題意,要返回的是最小磁力,所以第一步要找到最小磁力的最小可能取值和最大可能取值。

對於最小可能取值,當然就是給定陣列中距離最近的兩個位置之間的磁力,所以對陣列進行排序,並遍歷陣列找到相鄰兩個位置的最小距離。

對於最大可能取值,一共有m個球,所以有 m - 1 個間隔,最大的可能取值便是最平均的取值,所以根據給定陣列最大值與最小值之差與間隔數的比值計算出平均距離,就是給定的最大可能取值。

這裡給定簡單證明,假設有 k 個間隔,給定陣列規定的籃子間最大距離為 x,那麼最小磁力的最大可能取值是 x / k,假設有某一可能取值 y 大於最大可能取值,那麼所有距離都一定大於等於 y,此時假設 k 個間隔距離均為 y,總距離 ky > k * x / k = x,也大於給定的最大距離,所以不成立。

確定好了邊界後,每次二分搜尋時需要判斷當前計算值是否滿足條件,這裡我們引入 check 函式,對當前計算出的最小磁力進行驗證。驗證過程使用貪心演算法,遍歷陣列,若找到兩位置之間距離大於等於最小磁力,則計數值加1,最後只需要判斷總計數值是否大於等於給定間隔數 m - 1即可。

例如,示例1中,假設我們當前二分搜尋計算出的距離為 2,那麼我們遍歷陣列,假設第乙個位置為 1,那麼下乙個找到的位置應該是3,因為 3 - 1 >= 2,計數值加1;再下面找到的是 7,因為 7 - 3 >= 2,計數值加1。此時陣列遍歷完成,總計數值為 2,而給定間隔數 m - 1 = 2,滿足條件,說明最小磁力為2是可以做到的。但如果我們當前計算出的距離為4,那麼第乙個位置為1,找到的第二個位置就只能是7,陣列遍歷完成總計數值為1,小於給定間隔數,說明最小磁力為4是不成立的。

在判斷計算值滿足條件與否之後,我們要對二分搜尋邊界進行轉化,由於題目要求的是最大化的最小磁力,所以若當前計算出的最小磁力滿足條件,我們要將左邊界右移,去判斷稍大一點的數值是否滿足條件;若當前計算出的最小磁力不滿足條件,我們要將右邊界左移,判斷稍小的數值是否滿足條件。

由於每次滿足條件後左邊界右移,所以左邊界的左邊乙個數值是一定滿足條件的,所以最後返回值為 l - 1,具體返回值根據邊界移動的判定規則進行判斷。

**:

class solution 

}return cnt >= m - 1;

}int maxdistance(vector& a, int m)

}if(m == 2) else else

}return l - 1;}}

};

複雜度分析:

陣列排序時間複雜度o(nlgn),二分搜尋複雜度為o(lgn),每次進行check需要遍歷陣列,複雜度o(n),所以二分整體複雜度也為o(nlgn),故時間複雜度為o(nlgn);

維護了幾個變數,空間複雜度為o(1)。

思路:遞迴 + 記憶化

根據題意,主要思路是要把n配成2的倍數或者3的倍數,然後就可以大規模減少橘子的數量,所以利用簡單遞迴 + 記憶化即可。

實現細節:

假設當前有 n 個橘子,我們若想將其配成 2 的倍數,只需要花 n % 2 天每天吃乙個橘子即可;而配成 3 的倍數只需要花 n % 3 天每天吃乙個橘子即可。為了避免遞迴過程中的重複計算,利用unordered_map記錄中間過程。

**:

class solution  else if(n == 1)  else if(mp.count(n)) 

int res = min(mindays(n / 2) + n % 2 + 1, mindays(n / 3) + n % 3 + 1); // 配成倍數,注意最後要加一,因為按倍數吃橘子也算一天

mp[n] = res; // 記錄中間過程

return res;

}};

複雜度分析:

使用了記憶化,所以避免了重複計算子過程;遞迴的過程將 n 轉化為 n / 2 或 n / 3處理,時間複雜度為o(lgn);

維護了雜湊表,空間複雜度為o(lgn)。

Leetcode 第 202 場周賽

感覺就是拼手速的比賽,沒什麼意思,再打幾次把排名打到前面就不打了。存在連續三個奇數的陣列 給你乙個整數陣列 arr,請你判斷陣列中是否存在連續三個元素都是奇數的情況 如果存在,請返回 true 否則,返回 false class solution return false 使陣列中所有元素相等的最小...

LeetCode第202場周賽

用等差數列求和公式計算一下就知道,不管n為多少,所有數的和都是n 2,這樣平均數就是n,由於陣列前半部分和後半部分關於n對稱 關於中間位置對稱的兩個位置的 兩個元素相加和為2 n 所以我們只需要遍歷陣列的前半部分,把所有數和n的差值加起來,就是最終的答案了。首先,題目給的position陣列可能是無...

LeetCode 第202場周賽題解報告

5185.存在連續三個奇數的陣列 從 i 2 開始列舉,檢查 arr i 2 arr i 1 arr i 是否均為奇數。class solution return false 5488.使陣列中所有元素相等的最小運算元 陣列 arr 滿足 arr i 2 i 1 0 i n 其所有元素的累加和為 2...