生成平衡陣列的方案數
給你乙個整數陣列nums
。你需要選擇 恰好 乙個下標(下標從 0 開始)並刪除對應的元素。請注意剩下元素的下標可能會因為刪除操作而發生改變。
比方說,如果nums = [6,1,7,4,1]
,那麼:
如果乙個陣列滿足奇數下標元素的和與偶數下標元素的和相等,該陣列就是乙個 平衡陣列 。
請你返回刪除操作後,剩下的陣列nums
是 平衡陣列 的 方案數 。
示例 1:
輸入:nums = [2,1,6,4]
輸出:1
解釋:刪除下標 0 :[1,6,4] -> 偶數元素下標為:1 + 4 = 5 。奇數元素下標為:6 。不平衡。
刪除下標 1 :[2,6,4] -> 偶數元素下標為:2 + 4 = 6 。奇數元素下標為:6 。平衡。
刪除下標 2 :[2,1,4] -> 偶數元素下標為:2 + 4 = 6 。奇數元素下標為:1 。不平衡。
刪除下標 3 :[2,1,6] -> 偶數元素下標為:2 + 6 = 8 。奇數元素下標為:1 。不平衡。
只有一種讓剩餘陣列成為平衡陣列的方案。
示例 2:
輸入:nums = [1,1,1]
輸出:3
解釋:你可以刪除任意元素,剩餘陣列都是平衡陣列。
示例 3:
輸入:nums = [1,2,3]
輸出:0
解釋:不管刪除哪個元素,剩下陣列都不是平衡陣列。
解題思路:
題目要求我們刪除陣列的乙個元素然後使奇數下標的元素和等於偶數下標的元素和,要注意,刪除乙個位置的元素將會使後面所有元素的下標奇偶轉換(也就是奇數下標變成偶數下標)
我們可以利用這個性質,用乙個dp
陣列來儲存從0~i
位置的奇數下標元素和以及偶數下標的元素和,dp
陣列的初始化如下;dp[i][0]
存放奇數下標元素和,dp[i][1]
存放偶數下標元素和
for
(int i=
1; i<=nums.length; i++
)else
}
因此我們可以得到這樣乙個方程
int odd = dp[i-1][0]+dp[nums.length][1]-dp[i][1];
int even = dp[i-1][1]+dp[nums.length][0]-dp[i][0];
注意:奇偶下標逆轉了,當我們刪除掉i
位置的元素時,此時整個陣列的奇數下標元素和為前面0~i-1
的奇數下標元素和以及i+1~nums.length
的偶數和,另乙個同理
**如下:
class
solution
else
}for
(int i=
1; i<=nums.length; i++)}
else}}
return res;
}}
時間複雜度為o(n)
空間複雜度o(n)
1664 生成平衡陣列的方案數
題目描述 給你乙個整數陣列 nums 你需要選擇 恰好 乙個下標 下標從 0 開始 並刪除對應的元素。請注意剩下元素的下標可能會因為刪除操作而發生改變。比方說,如果 nums 6,1,7,4,1 那麼 選擇刪除下標 1 剩下的陣列為 nums 6,7,4,1 選擇刪除下標 2 剩下的陣列為 nums...
Leetcode 1664 生成平衡陣列的方案數
給你乙個整數陣列 nums 你需要選擇 恰好 乙個下標 下標從 0 開始 並刪除對應的元素。請注意剩下元素的下標可能會因為刪除操作而發生改變。比方說,如果 nums 6,1,7,4,1 那麼 選擇刪除下標 1 剩下的陣列為 nums 6,7,4,1 選擇刪除下標 2 剩下的陣列為 nums 6,1,...
生成兩數相乘結果的螺旋陣列
有人問到乙個演算法 兩數相乘,生成乙個螺旋陣列。舉例說明 3 4 生成的螺旋陣列為 1 2 3 4 10 11 12 5 9 8 7 6 5 6 生成的螺旋陣列為 1 2 3 4 5 6 18 19 20 21 22 7 17 28 29 30 23 8 16 27 26 25 24 9 15 14...