在做题中学习(47):将x减到0的最小操作数

发布时间:2024年01月16日

1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

解法:同向双指针————>滑动窗口

思路:本身令a+b = x且要a+b的长度最短 这种想法需要同时考虑前后,所以把它转变为只考虑一种情况:让a+b足够小————>让sum - a - b 足够大,也就是中间那块子数组最长,问题就转变为:找出一个最大的子数组,且它的sum == target 。而最后要返回的结果为数组总长度 - 最大子数组的长度。

滑动窗口步骤:

1.left = 0,right = 0

2.进窗口————>sum+=nums[right]

3.判断————>sum > target

4.出窗口+重新判断————>sum-=nums[left]

5.更新结果————>如果sum==target,就选出更大的len

class Solution 
{
public:
    int minOperations(vector<int>& nums, int x) 
    {
        //len1 总长度,len2 子数组长度
        //小细节 len2赋为-1 因为后面返回结果时如果求不出len的边界情况 直接返回len2就行
        int len1 = nums.size(), len2 = -1;
        int sum1 = 0, sum2 = 0;
        for(int i=0;i<len1;i++)
        {
            sum1 += nums[i];
        }
        int target = sum1 - x;
        //加判断是因为极端情况sum < x
        if(target < 0)
        {
            return -1;
        }
        for(int left = 0,right = 0;right<len1;)
        {
            //1.进窗口
            sum2 += nums[right];
            //2.判断
            while(sum2 > target)
            {
                //3.出窗口
                sum2 -= nums[left];
                left++;
            }
            //更新结果
            if(sum2 == target)
            {
                len2 = max(len2,right - left + 1);
            }
            right++;
        }
        //返回正确的最小操作数
        int ret = len1 - len2;
        if(len2 == -1)
        {
            return len2;
        }
        else
        {
            return ret;
        }
        

        
    }
};

文章来源:https://blog.csdn.net/yiren_liusong/article/details/135503573
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。