<LeetCode OJ> 209. Minimum Size Subarray Sum

针对给定的正整数数组及目标和s,寻找满足条件的最小子数组长度。通过双指针法实现O(N)复杂度算法,分享两种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

209. Minimum Size Subarray Sum

Total Accepted: 26840  Total Submissions: 105654  Difficulty: Medium

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s

If there isn't one, return 0 instead.

For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.


分析:

这个题目一来就应该想到应该一点一点累加恰好找到这个s的累加和,统计出长度
所以接着缩小数据,再次找到恰好大于s的位置,更新最小长度,恰好是为了尽可能小
具体:用一个迭代器慢ite1,一个迭代器快ite2
如果当前序列的和小于s则ite2继续右移动(增加和),否则ite1右移动(相当于减小和)

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if(nums.empty())
            return 0;
        vector<int>::iterator ite1=nums.begin();
        vector<int>::iterator ite2=ite1;
        int minLen=INT_MAX;
        int curSum=*ite1,curLen=1;
        while(true)
        {
            if(curSum >= s )
            {   
                if(curLen <minLen)
                    minLen=curLen;
                curSum-=*ite1;
                ite1++;
                curLen--;
                continue;
            }
            ite2++;
            if(ite2==nums.end())
                break;
            curLen++;
            curSum+=*ite2;
        }
        
        if(minLen==INT_MAX)
            return 0;
        return minLen;    
    }
};


别人的算法

(本质一样),O(N)的速度:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size(), start = 0, sum = 0, minlen = INT_MAX;
        for (int i = 0; i < n; i++) { 
            sum += nums[i]; 
            while (sum >= s) {
                minlen = min(minlen, i - start + 1);
                sum -= nums[start++];
            }
        }
        return minlen == INT_MAX ? 0 : minlen;
    }
};


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.youkuaiyun.com/ebowtang/article/details/50453943

原作者博客:http://blog.youkuaiyun.com/ebowtang

<think>我们需要将LeetCode模式改为ACM模式,即自己编写完整的程序,包括main函数来处理输入输出。 在ACM模式中,通常需要从标准输入(如键盘)读取数据,处理后再输出到标准输出(控制台)。 题目要求:给定一个由整数组成的非空数组digits,表示一个非负整数。将该整数加一,并返回结果数组。 修改步骤: 1. 添加main函数,处理输入输出。 2. 输入格式:通常ACM竞赛中,输入可能有多行,但这里我们假设输入一行数字,代表数组digits(例如:1 2 3)。 3. 读取输入:使用getline读取一行,然后用字符串流分割成整数。 4. 调用Solution类的plusOne方法。 5. 输出结果:将返回的数组输出(空格分隔)。 注意:原函数plusOne有错误,因为它只加了最后一位,但没有处理进位。例如[9,9]加一后应该变成[1,0,0]。 因此,我们需要先修复plusOne函数,使其正确处理进位。 修复plusOne的思路: - 从最后一位开始加1,然后向前处理进位。 - 如果某一位加1后等于10,则置0并进位1(继续处理前一位)。 - 如果到了第一位还有进位,则在数组开头插入1。 修改后的plusOne函数: 但是题目要求是修改为ACM模式,所以我们将修复函数并添加main函数。 修改后的代码:</think>要将LeetCode模式改为ACM模式,需要添加完整的输入输出处理逻辑。以下是修改后的代码,包含对输入的处理和进位逻辑的修复: ```cpp #include <iostream> #include <vector> #include <sstream> #include <string> using namespace std; class Solution { public: vector<int> plusOne(vector<int>& digits) { int carry = 1; // 初始进位为1(相当于加一) for (int i = digits.size() - 1; i >= 0; i--) { int sum = digits[i] + carry; digits[i] = sum % 10; // 当前位结果 carry = sum / 10; // 计算进位 if (carry == 0) break; // 无进位可提前终止 } // 处理最高位进位 if (carry > 0) { digits.insert(digits.begin(), carry); } return digits; } }; int main() { Solution sol; string input; // 读取整行输入 while (getline(cin, input)) { if (input.empty()) break; // 将字符串转换为整数数组 vector<int> digits; istringstream iss(input); int num; while (iss >> num) { digits.push_back(num); } // 执行加一操作 vector<int> result = sol.plusOne(digits); // 输出结果 for (int i = 0; i < result.size(); i++) { cout << result[i]; if (i < result.size() - 1) cout << " "; } cout << endl; } return 0; } ``` ### 关键修改说明: 1. **修复算法逻辑**: - 添加进位处理(从末位向首位遍历) - 处理最高位进位(如 `999 + 1 = 1000`) - 提前终止机制(无进位时停止循环) 2. **ACM输入处理**: - 使用 `getline(cin, input)` 读取整行输入 - 通过 `istringstream` 分割字符串为整数数组 - 支持多组测试数据(空行终止) 3. **输出格式**: - 数字间用空格分隔(如 `1 0 0 0`) - 每组结果单独一行 - 符合ACM竞赛标准输出格式 ### 使用示例: **输入**: ``` 1 2 3 9 9 ``` **输出**: ``` 1 2 4 1 0 0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值