生活随笔
收集整理的這篇文章主要介紹了
Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原題鏈接:Leecode 1658. 將 x 減到 0 的最小操作數
自己寫的代碼:
class Solution {
public:int minOperations(vector
<int>& nums
, int x
) {int n
=nums
.size();if(x
<nums
[0] && x
<nums
[n
-1]) return -1;vector
<int> sum(n
+1,0);for(int i
=0;i
<n
;i
++) sum
[i
+1]=sum
[i
]+nums
[i
];if(sum
[n
]<x
) return -1;int r
=1,l
=n
,i
=1,res
=INT_MAX
;for(;l
>=0;l
--){if(sum
[n
]-sum
[l
-1]>=x
) break;}for(;r
<n
+1;r
++){if(sum
[r
]>=x
) break;}if(sum
[n
]-sum
[l
-1]==x
) res
=min(res
,n
-l
+1);if(sum
[r
]==x
) res
=min(res
,r
);while(i
<=r
&& l
<=n
){int tmp
=sum
[i
]+sum
[n
]-sum
[l
-1];if(tmp
>x
) l
++;else {if(tmp
==x
) res
=min(res
,n
-l
+1+i
);i
++;}}return res
==INT_MAX
? -1:res
;}
};
參考別人的代碼:
思路:將 x 減到 0 的最小操作數(滑動窗口)
class Solution {
public:int minOperations(vector
<int>& nums
, int x
) {int n
=nums
.size();if(x
<nums
[0] && x
<nums
[n
-1]) return -1;int sum
=accumulate(nums
.begin(),nums
.end(),0);if(sum
<x
) return -1;int target
=sum
-x
,l
=0,r
=0,tmp
=0,res
=-1;while(r
<n
){tmp
+=nums
[r
++];while(tmp
>target
&& l
<n
) tmp
-=nums
[l
++];if(tmp
==target
) res
=max(res
,r
-l
);}return res
==-1? -1:n
-res
;}
};
總結
以上是生活随笔為你收集整理的Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。