• 面试题57


    题目

    输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

    序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

    示例 1:
    输入:target = 9
    输出:[[2,3,4],[4,5]]
    示例 2:
    输入:target = 15
    输出:[[1,2,3,4,5],[4,5,6],[7,8]]

    限制:1 <= target <= 10^5

    题解

    我们用两个指针 l 和 r 表示当前枚举到的以l为起点到r的区间,sum 表示 [l,r] 的区间和

    一共有三种情况:

    如果 sum<target 则说明指针r还可以向右拓展使得 sum 增大,此时指针 r 向右移动,即 r+=1
    如果 sum>target 则说明以 l 为起点不存在一个 r 使得 sum=target ,此时要枚举下一个起点,指针 l 向右移动,即l+=1
    如果 sum==target 则说明我们找到了以 l 为起点得合法解 [l,r] ,我们需要将 [l,r] 的序列放进答案数组,且我们知道以 l 为起点的合法解最多只有一个,所以需要枚举下一个起点,指针 l 向右移动,即 l+=1
    终止条件即为 l>=r 的时候,这种情况的发生指针 r 移动到了 (target+1)/2 的位置,此时的区间和大于target

    class Solution {
    public:
        vector<vector<int>> findContinuousSequence(int target) {
            vector<vector<int>> vec;
            vector<int> res;
            for(int l=1,r=2;l<r;)
            {
                int sum = (l+r)*(r-l+1)/2;
                if(sum == target)
                {
                    res.clear();
                    for(int i=l;i<=r;i++) res.emplace_back(i);
                    vec.emplace_back(res);
                    l++;
                }
                else if(sum < target) r++;
                else l++;
            }
            return vec;
        }
    };
    
  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/jiashun/p/LeetCode57.html
Copyright © 2020-2023  润新知