|
36 | 36 |
|
37 | 37 | ## 解法
|
38 | 38 |
|
39 |
| -双指针:`p = 1`,`q = 2`。 |
| 39 | +**方法一:双指针** |
| 40 | + |
| 41 | +我们可以使用双指针的方法,维护一个区间 $[l,.. r]$,使得区间内的数之和 $s$ 为 target,如果区间内的数之和小于 target,则右指针 $l$ 右移,如果区间内的数之和大于 target,则左指针 $l$ 右移,直到左指针到达 target 的一半为止。 |
| 42 | + |
| 43 | +时间复杂度 $O(target)$,忽略答案的空间消耗,空间复杂度 $O(1)$。 |
40 | 44 |
|
41 | 45 | <!-- tabs:start -->
|
42 | 46 |
|
|
45 | 49 | ```python
|
46 | 50 | class Solution:
|
47 | 51 | def findContinuousSequence(self, target: int) -> List[List[int]]:
|
48 |
| - res = [] |
49 |
| - p, q = 1, 2 |
50 |
| - while p < q: |
51 |
| - s = (p + q) * (q - p + 1) >> 1 |
| 52 | + l, r = 1, 2 |
| 53 | + ans = [] |
| 54 | + while l < r: |
| 55 | + s = (l + r) * (r - l + 1) // 2 |
52 | 56 | if s == target:
|
53 |
| - res.append([i for i in range(p, q + 1)]) |
54 |
| - p += 1 |
| 57 | + ans.append(list(range(l, r + 1))) |
| 58 | + l += 1 |
55 | 59 | elif s < target:
|
56 |
| - q += 1 |
| 60 | + r += 1 |
57 | 61 | else:
|
58 |
| - p += 1 |
59 |
| - return res |
| 62 | + l += 1 |
| 63 | + return ans |
60 | 64 | ```
|
61 | 65 |
|
62 | 66 | ### **Java**
|
63 | 67 |
|
64 | 68 | ```java
|
65 | 69 | class Solution {
|
66 | 70 | public int[][] findContinuousSequence(int target) {
|
67 |
| - List<int[]> list = new ArrayList<>(); |
68 |
| - int p = 1, q = 2; |
69 |
| - while (p < q) { |
70 |
| - int s = (p + q) * (q - p + 1) >> 1; |
| 71 | + int l = 1, r = 2; |
| 72 | + List<int[]> ans = new ArrayList<>(); |
| 73 | + while (l < r) { |
| 74 | + int s = (l + r) * (r - l + 1) / 2; |
71 | 75 | if (s == target) {
|
72 |
| - int[] t = new int[q - p + 1]; |
73 |
| - for (int i = 0; i < t.length; ++i) { |
74 |
| - t[i] = p + i; |
| 76 | + int[] t = new int[r - l + 1]; |
| 77 | + for (int i = l; i <= r; ++i) { |
| 78 | + t[i - l] = i; |
75 | 79 | }
|
76 |
| - list.add(t); |
77 |
| - ++p; |
| 80 | + ans.add(t); |
| 81 | + ++l; |
78 | 82 | } else if (s < target) {
|
79 |
| - ++q; |
| 83 | + ++r; |
80 | 84 | } else {
|
81 |
| - ++p; |
| 85 | + ++l; |
82 | 86 | }
|
83 | 87 | }
|
84 |
| - int[][] res = new int[list.size()][]; |
85 |
| - for (int i = 0; i < res.length; ++i) { |
86 |
| - res[i] = list.get(i); |
87 |
| - } |
88 |
| - return res; |
| 88 | + return ans.toArray(new int[0][]); |
89 | 89 | }
|
90 | 90 | }
|
91 | 91 | ```
|
92 | 92 |
|
93 |
| -### **JavaScript** |
94 |
| - |
95 |
| -```js |
96 |
| -/** |
97 |
| - * @param {number} target |
98 |
| - * @return {number[][]} |
99 |
| - */ |
100 |
| -var findContinuousSequence = function (target) { |
101 |
| - let res = []; |
102 |
| - let window = []; |
103 |
| - let i = 1; |
104 |
| - let sum = 0; |
105 |
| - while (1) { |
106 |
| - if (sum < target) { |
107 |
| - window.push(i); |
108 |
| - sum += i; |
109 |
| - i++; |
110 |
| - } else if (sum > target) { |
111 |
| - let a = window.shift(); |
112 |
| - if (window.length < 2) break; |
113 |
| - sum -= a; |
114 |
| - } else { |
115 |
| - res.push([...window]); |
116 |
| - window.push(i); |
117 |
| - sum += i; |
118 |
| - i++; |
119 |
| - if (window.length === 2) break; |
120 |
| - } |
121 |
| - } |
122 |
| - return res; |
123 |
| -}; |
124 |
| -``` |
125 |
| - |
126 | 93 | ### **C++**
|
127 | 94 |
|
128 | 95 | ```cpp
|
129 | 96 | class Solution {
|
130 | 97 | public:
|
131 |
| - vector<int> build(int small, int big) { |
132 |
| - vector<int> ret; |
133 |
| - for (int i = small; i <= big; i++) { |
134 |
| - ret.push_back(i); |
135 |
| - } |
136 |
| - |
137 |
| - return ret; |
138 |
| - } |
139 |
| - |
140 | 98 | vector<vector<int>> findContinuousSequence(int target) {
|
141 |
| - vector<vector<int>> ret; |
142 |
| - int small = 1; |
143 |
| - int big = 2; |
144 |
| - int mid = (target + 1) / 2; |
145 |
| - int curSum = small + big; |
146 |
| - |
147 |
| - if (target < 3) { |
148 |
| - ret; |
149 |
| - } |
150 |
| - |
151 |
| - while (small < mid) { |
152 |
| - if (curSum == target) { |
153 |
| - ret.push_back(build(small, big)); |
154 |
| - } |
155 |
| - |
156 |
| - while (curSum > target && small < mid) { |
157 |
| - // 一直减去,减去到比target小停止 |
158 |
| - curSum -= small; |
159 |
| - small++; |
160 |
| - |
161 |
| - if (curSum == target && small < mid) { |
162 |
| - ret.push_back(build(small, big)); |
163 |
| - } |
| 99 | + vector<vector<int>> ans; |
| 100 | + int l = 1, r = 2; |
| 101 | + while (l < r) { |
| 102 | + int s = (l + r) * (r - l + 1) / 2; |
| 103 | + if (s == target) { |
| 104 | + vector<int> t(r - l + 1); |
| 105 | + iota(t.begin(), t.end(), l); |
| 106 | + ans.emplace_back(t); |
| 107 | + ++l; |
| 108 | + } else if (s < target) { |
| 109 | + ++r; |
| 110 | + } else { |
| 111 | + ++l; |
164 | 112 | }
|
165 |
| - |
166 |
| - big++; |
167 |
| - curSum += big; |
168 | 113 | }
|
169 |
| - |
170 |
| - return ret; |
| 114 | + return ans; |
171 | 115 | }
|
172 | 116 | };
|
173 | 117 | ```
|
174 | 118 |
|
175 | 119 | ### **Go**
|
176 | 120 |
|
177 | 121 | ```go
|
178 |
| -func findContinuousSequence(target int) [][]int { |
179 |
| - ans := make([][]int, 0) |
180 |
| - window := 0 |
181 |
| - left, right := 1, 1 |
182 |
| - for n := target / 2; left <= n; { |
183 |
| - if window < target { |
184 |
| - window += right |
185 |
| - right++ |
186 |
| - } else if window > target { |
187 |
| - window -= left |
188 |
| - left++ |
189 |
| - } else { |
190 |
| - tmp := make([]int, 0, right-left) |
191 |
| - for i := left; i < right; i++ { |
192 |
| - tmp = append(tmp, i) |
| 122 | +func findContinuousSequence(target int) (ans [][]int) { |
| 123 | + l, r := 1, 2 |
| 124 | + for l < r { |
| 125 | + s := (l + r) * (r - l + 1) / 2 |
| 126 | + if s == target { |
| 127 | + t := make([]int, r-l+1) |
| 128 | + for i := range t { |
| 129 | + t[i] = l + i |
193 | 130 | }
|
194 |
| - ans = append(ans, tmp) |
195 |
| - window -= left |
196 |
| - left++ |
| 131 | + ans = append(ans, t) |
| 132 | + l++ |
| 133 | + } else if s < target { |
| 134 | + r++ |
| 135 | + } else { |
| 136 | + l++ |
197 | 137 | }
|
198 | 138 | }
|
199 |
| - return ans |
| 139 | + return |
200 | 140 | }
|
201 | 141 | ```
|
202 | 142 |
|
| 143 | +### **JavaScript** |
| 144 | + |
| 145 | +```js |
| 146 | +/** |
| 147 | + * @param {number} target |
| 148 | + * @return {number[][]} |
| 149 | + */ |
| 150 | +var findContinuousSequence = function (target) { |
| 151 | + const ans = []; |
| 152 | + let l = 1; |
| 153 | + let r = 2; |
| 154 | + while (l < r) { |
| 155 | + const s = ((l + r) * (r - l + 1)) >> 1; |
| 156 | + if (s == target) { |
| 157 | + const t = []; |
| 158 | + for (let i = l; i <= r; ++i) { |
| 159 | + t.push(i); |
| 160 | + } |
| 161 | + ans.push(t); |
| 162 | + ++l; |
| 163 | + } else if (s < target) { |
| 164 | + ++r; |
| 165 | + } else { |
| 166 | + ++l; |
| 167 | + } |
| 168 | + } |
| 169 | + return ans; |
| 170 | +}; |
| 171 | +``` |
| 172 | + |
203 | 173 | ### **C#**
|
204 | 174 |
|
205 | 175 | ```cs
|
206 | 176 | public class Solution {
|
207 | 177 | public int[][] FindContinuousSequence(int target) {
|
208 |
| - List<int[]> res = new List<int[]>(); |
209 |
| - int p = 1, q = 2; |
210 |
| - while (p < q) { |
211 |
| - int s = (p + q) * (q - p + 1) >> 1; |
| 178 | + List<int[]> ans = new List<int[]>(); |
| 179 | + int l = 1, r = 2; |
| 180 | + while (l < r) { |
| 181 | + int s = (l + r) * (r - l + 1) >> 1; |
212 | 182 | if (s == target) {
|
213 |
| - List<int> tmp = new List<int>(); |
214 |
| - for (int i = p; i < q + 1; i++) { |
215 |
| - tmp.Add(i); |
| 183 | + List<int> t = new List<int>(); |
| 184 | + for (int i = l; i <= r; i++) { |
| 185 | + t.Add(i); |
216 | 186 | }
|
217 |
| - p += 1; |
218 |
| - res.Add(tmp.ToArray()); |
| 187 | + l += 1; |
| 188 | + ans.Add(t.ToArray()); |
219 | 189 | } else if (s < target) {
|
220 |
| - q += 1; |
| 190 | + r += 1; |
221 | 191 | } else {
|
222 |
| - p += 1; |
| 192 | + l += 1; |
223 | 193 | }
|
224 | 194 | }
|
225 |
| - return res.ToArray(); |
| 195 | + return ans.ToArray(); |
226 | 196 | }
|
227 | 197 | }
|
228 | 198 | ```
|
|
0 commit comments