LeetCode第202場周賽

2022-08-11 09:03:13 字數 2465 閱讀 7761

用等差數列求和公式計算一下就知道,不管n為多少,所有數的和都是n^2,這樣平均數就是n,由於陣列前半部分和後半部分關於n對稱(關於中間位置對稱的兩個位置的

兩個元素相加和為2*n),所以我們只需要遍歷陣列的前半部分,把所有數和n的差值加起來,就是最終的答案了。

首先,題目給的position陣列可能是無序的,所以需要先對position陣列排序,排序之後我們希望能夠在所有籃子裡放上m個球,讓任意兩個球

之間的最小距離最大。

由於position的最大範圍到了1e9,所以我們如果從1開始逐個考慮增大最大距離來放球,就比較慢。

因為position範圍大,所以我們可以考慮二分。

這裡二分的是距離,也就是兩個球之間的距離,假設現在二分到的距離為mid,因為第乙個球肯定是放在最左邊,所以我們遍歷position陣列,找到下乙個距離大於

mid且離上乙個球最近的籃子的position,在這裡放乙個球,然後再找下乙個位置,就這樣,如果遍歷完陣列之前能夠放下所有的球,說明當前這個距離ok,我們就更新一下答案,

然後擴大mid,嘗試兩個球之前放遠一點行不行。

如果某個距離mid使得遍歷完position之後放不了m個球,說明距離太大了,我們需要減小距離(為了多放點球)。

由於需要多次判斷某距離是否可以放下m個球,我們寫乙個check函式,判斷在position陣列中距離為dis時是否能放下m個球。

**如下:

class solution 

}return m == 0; //剩餘球的數量為0,說明放滿了m個球,說明最小距離為dis是ok的

每天都有可能有三種操作:(1)吃掉乙個橘子; (2)如果當前橘子的數量是偶數的話,可以吃掉一半的橘子;

(3)如果當前橘子的數量是三的倍數的話,可以吃掉三分之二的橘子。

由於對於每個數量,都需要用到比它較小的幾個數量的值,所以我們很容易想到記憶化搜尋。以及遞推計算每個數量的橘子

對應的天數。

由於每一天都可以吃掉乙個橘子,所以理論上我們每天都會遞推到前一天的狀態,這樣,我們記憶化搜尋開的狀態陣列實際上就是o(n)的,

由於這題資料範圍最大可以到2e9,因此這個空間開銷還是太大了。

我們需要想辦法優化遞推方式。

可以這麼想,對於乙個較大的數,假設我們只可以進行前兩個操作(1)吃掉乙個橘子; (2)如果當前橘子的數量是偶數的話,可以吃掉一半的橘子。

那麼,如果我們當前不能直接吃掉一半(橘子數量不是偶數),我們也希望吃掉乙個橘子之後馬上就吃掉一半橘子,而不是乙個乙個吃掉。

所以實際上,我們不需要乙個乙個往下算,減一操作到當前橘子數量是偶數就可以了。

同理,如果我們能讓當前橘子數量除以3,我們也希望能在進行幾次「吃掉乙個橘子」的操作之後讓橘子的數量達到3的倍數。

這樣也能減小減一操作的次數,更重要的是,優化了空間。

同樣的,由於經常進行除2和除3操作,所以我們沒有必要儲存太多的狀態,只需要儲存一些常用的,因此我們可以考慮用乙個雜湊表unordered_map來儲存

每個數量的橘子對應的天數,這樣,我們沒有計算到的橘子數量,就沒必要儲存天數了,這進一步優化了空間。

**如下:

class solution 

if(n == 2 || n == 3)

auto it = dp.find(n);

if(it != dp.end())

dp[n] = min(getdays(n / 2) + 1 + (n % 2), getdays(n / 3) + 1 + (n % 3)); //+1是因為除2或除3需要一天時間,(n % 2)和(n % 3)是讓當前天數變為2或3的倍數需要「減一」的天數

return dp[n];

}int mindays(int n)

};

Leetcode 第 202 場周賽

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

LeetCode 第 202 場周賽 題解

思路 暴力 簽到題,暴力遍歷即可。class solution return false 複雜度分析 遍歷陣列,時間複雜度o n 沒有使用額外變數,空間複雜度為o 1 思路 數學 根據題意,可以直接將陣列以中心元素為對稱點,兩兩配對,操作的次數相同。所以只需要針對陣列長度奇偶進行分析即可。實現細節 ...

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