題目描述:
給你乙個整數陣列 nums 和乙個整數 x 。每一次操作時,你應當移除陣列 nums 最左邊或最右邊的元素,然後從 x 中減去該元素的值。請注意,需要 修改 陣列以供接下來的操作使用。
如果可以將 x 恰好 減到 0 ,返回 最小運算元 ;否則,返回 -1 。
示例 1:
輸入:nums = [1,1,4,2,3], x = 5
輸出:2
解釋:最佳解決方案是移除後兩個元素,將 x 減到 0 。
示例 2:
輸入:nums = [5,6,7,8,9], x = 4
輸出:-1
示例 3:
輸入:nums = [3,2,20,1,1,3], x = 10
輸出:5
解釋:最佳解決方案是移除後三個元素和前兩個元素(總共 5 次操作),將 x 減到 0 。
1 <= nums.length <= 105
1 <= nums[i] <= 104
1 <= x <= 109
方法1:
主要思路:
(1)主要的難點是能夠轉換思路,將原題中的問題轉換成對應的其他問題;
(2)將原來的從兩端減小多少次變為0的問題,轉成找出陣列中存在的連續的最長的子陣列的和為某個目標值,目標值為原陣列的總和減去給出的x所得的值;
(3)這樣,就可以直接使用滑動視窗的思路,找出該最長的子陣列的長度,再用總的長度減去子陣列的長度即為原問題的答案;
class
solution
if(sumif(sum==x)
x=sum-x;
//調整目標值
sum=0;
//重新用於統計子陣列的區域性和
int len=nums.
size()
;//原陣列的總的長度
int left=
0,right=0;
//滑動視窗的左右邊界
int res=0;
//統計各個滿足要求的視窗的長度
while
(right//若當前視窗滿足要求,則將當前的視窗長度更新與結果中
if(sum==x)
//減小左邊的視窗邊界,直到視窗內沒有元素或區域性和小於等於目標值
while
(leftx)
//若當前視窗滿足要求,則將當前的視窗的長度更新與結果中
if(sum==x)}if
(res==0)
return len-res;
//返回需要去除的陣列元素的個數}}
;
將 x 減到 0 的最小運算元
給你乙個整數陣列nums和乙個整數x。每一次操作時,你應當移除陣列nums最左邊或最右邊的元素,然後從x中減去該元素的值。請注意,需要修改陣列以供接下來的操作使用。如果可以將x恰好減到0,返回最小運算元 否則,返回 1。示例 1 輸入 nums 1,1,4,2,3 x 5輸出 2解釋 最佳解決方案是...
力扣 1658 將 x 減到 0 的最小運算元
題目描述 示例 1 輸入 nums 1 1,4 2,3 x 5輸出 2 解釋 最佳解決方案是移除後兩個元素,將 x 減到 0 示例 2 輸入 nums 5 6,7 8,9 x 4輸出 1示例 3 輸入 nums 3 2,20 1,1 3 x 10輸出 5 解釋 最佳解決方案是移除後三個元素和前兩個元...
關於0x0d與0x0a的ASCII。
今天發現乙個有趣的現象 在 ma 我用的版本是6.11 中作彙編時發現,0x0d與0x0a有著不同的作用。比如 dead for dream 在這個字串後只加上0x0d則得到 游標移到開頭的那個d下面,而沒有換行 再輸入字元的話,將原來的字元著改掉。在這個字串上只加上0x0a則得到 游標移到末尾m字...