📘 題目敘述
給你一個長度為 n 的陣列
nums1,其中所有整數都互不相同。
你想要再建出另一個長度也是 n 的陣列
nums2,並且讓
nums2 裡的元素要嘛全部都是奇數,要嘛全部都是偶數。
對每個 index i,你必須剛好從下面兩種方式中選一種來決定
nums2[i]:
nums2[i] = nums1[i]-
nums2[i] = nums1[i] - nums1[j],其中j != i
請回傳是否有可能建出這樣的 nums2。
條件限制
1 <= n == nums1.length <= 1001 <= nums1[i] <= 100nums1中所有整數都互不相同
🧠 解題思路
這題最後其實只跟陣列裡:
- 有沒有奇數
- 有沒有偶數
有關。
分情況看:
情況 1:全部都是偶數
那直接全部保留原值,nums2 全偶,答案是
true。
情況 2:全部都是奇數
那直接全部保留原值,nums2 全奇,答案也是
true。
情況 3:同時有奇數和偶數
這時更簡單,因為:
- 對奇數位置,可以直接保留成奇數
- 對偶數位置,可以找一個奇數做差,變成奇數
所以全部做成奇數一定可以。
例如:
- 偶數 - 奇數 = 奇數
而且題目保證數字互不相同,只要陣列裡同時有奇數和偶數,就一定找得到對應的
j != i。
所以這種情況答案也一定是 true。
所以最後結論其實是:
這題永遠都是
true。
因為不管 nums1 裡是:
- 全奇
- 全偶
- 奇偶混合
都能建出一個全部同奇偶的 nums2。
所有變數
- 根本不需要XD
🪜 主要流程步驟
1. 觀察題目只在乎奇偶性
這題不是要你算特定值,而是只問最後能不能讓整個 nums2:
- 全奇
- 或全偶
所以真正該分析的是操作會怎麼改變奇偶性。
2. 分析兩種操作的奇偶效果
對每個位置 i,可以做兩種事:
- 直接取
nums1[i] - 取差值
nums1[i] - nums1[j]
其中差值的奇偶規則是:
- 同奇偶相減會得到偶數
- 不同奇偶相減會得到奇數
3. 分情況討論原陣列的奇偶組成
全部都是偶數
直接全部保留原值,就已經是全偶數,所以可以。
全部都是奇數
直接全部保留原值,就已經是全奇數,所以可以。
同時有奇數和偶數
這時我可以選擇把全部做成奇數:
- 原本是奇數的位置,直接保留
- 原本是偶數的位置,拿它減掉某個奇數
- 偶數 - 奇數 = 奇數
所以也可以成功。
4. 因此答案永遠是 true
不管輸入怎麼分布,都能建出符合要求的
nums2,所以直接回傳 true 即可。
⏱️ 複雜度
- 時間複雜度:
O(1)
這份程式直接回傳答案,沒有額外掃描。
- 空間複雜度:
O(1)
只使用固定空間。
💻 程式碼實作
class Solution {
public:
bool uniformArray(vector<int>& nums1) {
return true;
}
};
🔗 題目連結
https://leetcode.com/contest/weekly-contest-494/problems/construct-uniform-parity-array-i/