1657 將 x 減到 0 的最小運算元

2021-10-10 14:03:51 字數 1374 閱讀 9103

題目描述:

給你乙個整數陣列 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字...