🔗 🟢 3038. Maximum Number of Operations With the Same Score I 1202

tags: Biweekly Contest 124 模擬(Simulation)

題意

給定一個整數陣列 numsnums,如果 numsnums 至少 包含 22 個元素,你可以執行以下操作:

  • 選擇 numsnums 中的 前兩個 元素並刪除它們,該次操作的分數為被刪除元素的和。

你的任務是找到可以執行的最大操作次數,使所有操作的得分相同,返回滿足上述條件的最大操作次數。

約束條件

  • 2len(nums)1002 \leq \text{len}(nums) \leq 100
  • 1nums[i]10001 \leq nums[i] \leq 1000

思路:模擬(Simulation)

題目確保了 numsnums 至少包含 22 個元素,因此可以先計算它們的和作為初始的目標得分。之後每次遍歷陣列的兩個元素,按照題意模擬即可。

複雜度分析

  • 時間複雜度:O(n)\mathcal{O}(n),其中 nn 是陣列 numsnums 的長度。
  • 空間複雜度:O(1)\mathcal{O}(1)

寫法一

賽時寫法,比較直觀。

使用 targettarget 變數來記錄前兩個元素的和,ansans 變數紀錄操作次數,初始化為 11,表示最大操作次數至少為 11。然後從 i=2i=2 開始,每次檢查兩個元素的和是否等於 targettarget,如果是則操作次數加一,否則跳出迴圈。

若從 i=2i=2 開始,由於每次要檢查 iii+1i+1 兩個元素,因此需要檢查 i+1i+1 是否超出範圍;也可以從 i=3i=3 開始,每次檢查 i1i-1ii,這樣就不會有超出範圍的問題。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxOperations(self, nums: List[int]) -> int:
n = len(nums)
target = nums[0] + nums[1]
ans = 1
for i in range(2, n, 2):
if i + 1 < n and nums[i] + nums[i+1] == target:
ans += 1
else:
break
return ans
1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int maxOperations(vector<int>& nums) {
int n = nums.size();
int ans = 1, target = nums[0] + nums[1];
for (int i = 2; i < n; i += 2){
if (i + 1 < n && nums[i] + nums[i+1] == target) ans++;
else break;
}
return ans;
}
};

寫法二:省略 ans 變數

靈神提供的解法,省略了變數 ansans ,直接用下標 ii 來計算操作次數,優美且簡潔。

i=3i = 3 開始,每次檢查該元素與前面一個元素的和是否等於 targettarget,如果不是則直接返回 i2\lfloor \frac{i}{2} \rfloor ,否則繼續檢查下一對元素,直到結束,返回 n2\lfloor \frac{n}{2} \rfloor

1
2
3
4
5
6
7
8
class Solution:
def maxOperations(self, nums: List[int]) -> int:
n = len(nums)
target = nums[0] + nums[1]
for i in range(3, n, 2):
if nums[i-1] + nums[i] != target:
return i // 2
return n // 2
1
2
3
4
5
6
7
8
9
10
class Solution {
public:
int maxOperations(vector<int>& nums) {
int n = nums.size(), target = nums[0] + nums[1];
for (int i = 3; i < n; i += 2){
if (nums[i-1] + nums[i] != target) return i / 2;
}
return n / 2;
}
};

參考資料


寫在最後

Cover photo is generated by @たろたろ, thanks for their work!

把半成品的文章丟給 LLM 補全,比完全讓他自己寫的效果好多了,能夠確保結果的一致性,但還是需要自己補充和修改一些地方。

你的目的是為一道演算法題撰寫一份題解(解題報告),以下是題解的一部份,包含了程式碼,請你閱讀程式碼後,給出對應的思路,並針對 <++> 的部分加上說明。