57 - II. 和为 s 的连续正数序列


comments: true
difficulty: 简单
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9857%20-%20II.%20%E5%92%8C%E4%B8%BAs%E7%9A%84%E8%BF%9E%E7%BB%AD%E6%AD%A3%E6%95%B0%E5%BA%8F%E5%88%97/README.md

面试题 57 - II. 和为 s 的连续正数序列

题目描述

输入一个正整数 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

 

限制:

  • 1 <= target <= 10^5

解法

方法一:双指针

我们可以使用双指针的方法,维护一个区间 [ l , . . r ] [l,.. r] [l,..r],使得区间内的数之和 s s s 为 target,如果区间内的数之和小于 target,则右指针 l l l 右移,如果区间内的数之和大于 target,则左指针 l l l 右移,直到左指针到达 target 的一半为止。

时间复杂度 O ( t a r g e t ) O(target) O(target),忽略答案的空间消耗,空间复杂度 O ( 1 ) O(1) O(1)

Python3
class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        l, r = 1, 2
        ans = []
        while l < r:
            s = (l + r) * (r - l + 1) // 2 #等差数列求和
            if s == target:
                ans.append(list(range(l, r + 1)))
                l += 1 #寻找新的可能
            elif s < target:
                r += 1
            else:
                l += 1
        return ans
Java
class Solution {
    public int[][] findContinuousSequence(int target) {
        int l = 1, r = 2;
        List<int[]> ans = new ArrayList<>();
        while (l < r) {
            int s = (l + r) * (r - l + 1) / 2;
            if (s == target) {
                int[] t = new int[r - l + 1];
                for (int i = l; i <= r; ++i) {
                    t[i - l] = i;
                }
                ans.add(t);
                ++l;
            } else if (s < target) {
                ++r;
            } else {
                ++l;
            }
        }
        return ans.toArray(new int[0][]);
    }
}
C++
class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> ans;
        int l = 1, r = 2;
        while (l < r) {
            int s = (l + r) * (r - l + 1) / 2;
            if (s == target) {
                vector<int> t(r - l + 1);
                iota(t.begin(), t.end(), l);
                ans.emplace_back(t);
                ++l;
            } else if (s < target) {
                ++r;
            } else {
                ++l;
            }
        }
        return ans;
    }
};
Go
func findContinuousSequence(target int) (ans [][]int) {
	l, r := 1, 2
	for l < r {
		s := (l + r) * (r - l + 1) / 2
		if s == target {
			t := make([]int, r-l+1)
			for i := range t {
				t[i] = l + i
			}
			ans = append(ans, t)
			l++
		} else if s < target {
			r++
		} else {
			l++
		}
	}
	return
}
JavaScript
/**
 * @param {number} target
 * @return {number[][]}
 */
var findContinuousSequence = function (target) {
    const ans = [];
    let l = 1;
    let r = 2;
    while (l < r) {
        const s = ((l + r) * (r - l + 1)) >> 1;
        if (s == target) {
            const t = [];
            for (let i = l; i <= r; ++i) {
                t.push(i);
            }
            ans.push(t);
            ++l;
        } else if (s < target) {
            ++r;
        } else {
            ++l;
        }
    }
    return ans;
};
C#
public class Solution {
    public int[][] FindContinuousSequence(int target) {
        List<int[]> ans = new List<int[]>();
        int l = 1, r = 2;
        while (l < r) {
            int s = (l + r) * (r - l + 1) >> 1;
            if (s == target) {
                List<int> t = new List<int>();
                for (int i = l; i <= r; i++) {
                    t.Add(i);
                }
                l += 1;
                ans.Add(t.ToArray());
            } else if (s < target) {
                r += 1;
            } else {
                l += 1;
            }
        }
        return ans.ToArray();
    }
}
Swift
class Solution {
    func findContinuousSequence(_ target: Int) -> [[Int]] {
        var l = 1, r = 2
        var result = [[Int]]()

        while l < r {
            let sum = (l + r) * (r - l + 1) / 2
            if sum == target {
                var sequence = [Int]()
                for i in l...r {
                    sequence.append(i)
                }
                result.append(sequence)
                l += 1
            } else if sum < target {
                r += 1
            } else {
                l += 1
            }
        }

        return result
    }
}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改后的代码如下: ```matlab % 设置参数 fs = 1000; % 采样率 bits = 12; % 分辨率 vref = 5; % 参考电压 % 生成数字信号 data = [-619.76715 -529.13434 -312.71863 -167.78337 -146.2360 -80.175125 -16.083157 -43.989765 -44.47398 -47.258278 -33.44726 -54.801384 -59.248947 -50.705193 -65.35704-57.36374 -45.225815 -31.582525 -28.156683 -59.727234 -54.488205 -24.398212 -43.865265 -45.365425 -77.97594 -54.436 -41.721855 -65.16225 -71.07881 -51.758736 -93.98244 -84.74326 -140.21878 -97.946014 -92.74178 -73.625725 -117.73671 -121.05837 -131.25688 -110.62707 -147.19264 -176.98892 -170.10733 -152.15996 -163.76915 -175.61983 -188.67313 -238.54276 -245.13528 -249.34978]; % 输入数据 data = data / 100; % 将输入数据除以100,得到一百分之一的幅值 t = 0:1/fs:(length(data)-1)/fs; % 时间向量 % 模拟DAC codebook = linspace(-vref, 0, 2^bits); % 生成量化码本 [dac_signal, quants] = quantiz(data, codebook(1:end-1), codebook); % 进行DAC模拟转换,输出DAC输出信号和量化误差 dac_signal = -dac_signal; % 反相输出信号,使其变为正数 analog_signal = vref*dac_signal; % 将DAC输出信号乘以参考电压得到模拟信号 % 输出结果 plot(t, analog_signal); % 绘制模拟信号波形 xlabel('Time (s)'); ylabel('Voltage (V)'); title('Analog Signal (scaled down by 100)'); ``` 这里直接将输入数据除以100,得到一百分之一的幅值,不需要对量化码本进行修改。输出的模拟信号电压就是输入数字信号的一百分之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值