Skip to content

Commit 0cb85b0

Browse files
committed
feat: add solutions to lc problem: No.0228
No.0228.Summary Ranges
1 parent 013aa6d commit 0cb85b0

File tree

7 files changed

+143
-160
lines changed

7 files changed

+143
-160
lines changed

solution/0200-0299/0228.Summary Ranges/README.md

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60+
**方法一:双指针**
61+
62+
我们可以用双指针 $i$ 和 $j$ 找出每个区间的左右端点。
63+
64+
遍历数组,当 $j + 1 < n$ 且 $nums[j + 1] = nums[j] + 1$ 时,$j$ 向右移动,否则区间 $[i, j]$ 已经找到,将其加入答案,然后将 $i$ 移动到 $j + 1$ 的位置,继续寻找下一个区间。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。
67+
6068
<!-- tabs:start -->
6169

6270
### **Python3**
@@ -66,19 +74,19 @@
6674
```python
6775
class Solution:
6876
def summaryRanges(self, nums: List[int]) -> List[str]:
69-
def make(nums, i, j):
77+
def f(i, j):
7078
return str(nums[i]) if i == j else f'{nums[i]}->{nums[j]}'
7179

72-
i = j = 0
80+
i = 0
7381
n = len(nums)
74-
res = []
75-
while j < n:
76-
while j + 1 < n and nums[j] + 1 == nums[j + 1]:
82+
ans = []
83+
while i < n:
84+
j = i
85+
while j + 1 < n and nums[j + 1] == nums[j] + 1:
7786
j += 1
78-
res.append(make(nums, i, j))
87+
ans.append(f(i, j))
7988
i = j + 1
80-
j = i
81-
return res
89+
return ans
8290
```
8391

8492
### **Java**
@@ -88,20 +96,19 @@ class Solution:
8896
```java
8997
class Solution {
9098
public List<String> summaryRanges(int[] nums) {
91-
List<String> res = new ArrayList<>();
92-
for (int i = 0, j = 0, n = nums.length; j < n;) {
93-
while (j + 1 < n && nums[j] + 1 == nums[j + 1]) {
99+
List<String> ans = new ArrayList<>();
100+
for (int i = 0, j, n = nums.length; i < n; i = j + 1) {
101+
j = i;
102+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
94103
++j;
95104
}
96-
res.add(make(nums, i, j));
97-
i = j + 1;
98-
j = i;
105+
ans.add(f(nums, i, j));
99106
}
100-
return res;
107+
return ans;
101108
}
102109

103-
private String make(int[] nums, int i, int j) {
104-
return i == j ? String.valueOf(nums[i]) : String.format("%d->%d", nums[i], nums[j]);
110+
private String f(int[] nums, int i, int j) {
111+
return i == j ? nums[i] + "" : String.format("%d->%d", nums[i], nums[j]);
105112
}
106113
}
107114
```
@@ -112,43 +119,40 @@ class Solution {
112119
class Solution {
113120
public:
114121
vector<string> summaryRanges(vector<int>& nums) {
115-
vector<string> res;
116-
for (int i = 0, j = 0, n = nums.size(); j < n;) {
117-
while (j + 1 < n && nums[j] + 1 == nums[j + 1]) ++j;
118-
res.push_back(make(nums, i, j));
119-
i = j + 1;
122+
vector<string> ans;
123+
auto f = [&](int i, int j) {
124+
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
125+
};
126+
for (int i = 0, j, n = nums.size(); i < n; i = j + 1) {
120127
j = i;
128+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
129+
++j;
130+
}
131+
ans.emplace_back(f(i, j));
121132
}
122-
return res;
123-
}
124-
125-
string make(vector<int>& nums, int i, int j) {
126-
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
133+
return ans;
127134
}
128135
};
129136
```
130137
131138
### **Go**
132139
133140
```go
134-
func summaryRanges(nums []int) []string {
135-
var res []string
136-
for i, j, n := 0, 0, len(nums); j < n; {
137-
for j+1 < n && nums[j]+1 == nums[j+1] {
138-
j++
141+
func summaryRanges(nums []int) (ans []string) {
142+
f := func(i, j int) string {
143+
if i == j {
144+
return strconv.Itoa(nums[i])
139145
}
140-
res = append(res, make(nums, i, j))
141-
i = j + 1
142-
j = i
146+
return strconv.Itoa(nums[i]) + "->" + strconv.Itoa(nums[j])
143147
}
144-
return res
145-
}
146-
147-
func make(nums []int, i, j int) string {
148-
if i == j {
149-
return strconv.Itoa(nums[i])
148+
for i, j, n := 0, 0, len(nums); i < n; i = j + 1 {
149+
j = i
150+
for j+1 < n && nums[j+1] == nums[j]+1 {
151+
j++
152+
}
153+
ans = append(ans, f(i, j))
150154
}
151-
return strconv.Itoa(nums[i]) + "->" + strconv.Itoa(nums[j])
155+
return
152156
}
153157
```
154158

@@ -157,21 +161,18 @@ func make(nums []int, i, j int) string {
157161
```cs
158162
public class Solution {
159163
public IList<string> SummaryRanges(int[] nums) {
160-
var res = new List<string>();
161-
for (int i = 0, j = 0, n = nums.Length; j < n;)
162-
{
163-
while (j + 1 < n && nums[j] + 1 == nums[j + 1])
164-
{
164+
var ans = new List<string>();
165+
for (int i = 0, j = 0, n = nums.Length; i < n; i = j + 1) {
166+
j = i;
167+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
165168
++j;
166169
}
167-
res.Add(make(nums, i, j));
168-
i = j + 1;
169-
j = i;
170+
ans.Add(f(nums, i, j));
170171
}
171-
return res;
172+
return ans;
172173
}
173174

174-
public string make(int[] nums, int i, int j) {
175+
public string f(int[] nums, int i, int j) {
175176
return i == j ? nums[i].ToString() : string.Format("{0}->{1}", nums[i], nums[j]);
176177
}
177178
}

solution/0200-0299/0228.Summary Ranges/README_EN.md

Lines changed: 45 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -60,40 +60,39 @@
6060
```python
6161
class Solution:
6262
def summaryRanges(self, nums: List[int]) -> List[str]:
63-
def make(nums, i, j):
63+
def f(i, j):
6464
return str(nums[i]) if i == j else f'{nums[i]}->{nums[j]}'
6565

66-
i = j = 0
66+
i = 0
6767
n = len(nums)
68-
res = []
69-
while j < n:
70-
while j + 1 < n and nums[j] + 1 == nums[j + 1]:
68+
ans = []
69+
while i < n:
70+
j = i
71+
while j + 1 < n and nums[j + 1] == nums[j] + 1:
7172
j += 1
72-
res.append(make(nums, i, j))
73+
ans.append(f(i, j))
7374
i = j + 1
74-
j = i
75-
return res
75+
return ans
7676
```
7777

7878
### **Java**
7979

8080
```java
8181
class Solution {
8282
public List<String> summaryRanges(int[] nums) {
83-
List<String> res = new ArrayList<>();
84-
for (int i = 0, j = 0, n = nums.length; j < n;) {
85-
while (j + 1 < n && nums[j] + 1 == nums[j + 1]) {
83+
List<String> ans = new ArrayList<>();
84+
for (int i = 0, j, n = nums.length; i < n; i = j + 1) {
85+
j = i;
86+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
8687
++j;
8788
}
88-
res.add(make(nums, i, j));
89-
i = j + 1;
90-
j = i;
89+
ans.add(f(nums, i, j));
9190
}
92-
return res;
91+
return ans;
9392
}
9493

95-
private String make(int[] nums, int i, int j) {
96-
return i == j ? String.valueOf(nums[i]) : String.format("%d->%d", nums[i], nums[j]);
94+
private String f(int[] nums, int i, int j) {
95+
return i == j ? nums[i] + "" : String.format("%d->%d", nums[i], nums[j]);
9796
}
9897
}
9998
```
@@ -104,43 +103,40 @@ class Solution {
104103
class Solution {
105104
public:
106105
vector<string> summaryRanges(vector<int>& nums) {
107-
vector<string> res;
108-
for (int i = 0, j = 0, n = nums.size(); j < n;) {
109-
while (j + 1 < n && nums[j] + 1 == nums[j + 1]) ++j;
110-
res.push_back(make(nums, i, j));
111-
i = j + 1;
106+
vector<string> ans;
107+
auto f = [&](int i, int j) {
108+
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
109+
};
110+
for (int i = 0, j, n = nums.size(); i < n; i = j + 1) {
112111
j = i;
112+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
113+
++j;
114+
}
115+
ans.emplace_back(f(i, j));
113116
}
114-
return res;
115-
}
116-
117-
string make(vector<int>& nums, int i, int j) {
118-
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
117+
return ans;
119118
}
120119
};
121120
```
122121
123122
### **Go**
124123
125124
```go
126-
func summaryRanges(nums []int) []string {
127-
var res []string
128-
for i, j, n := 0, 0, len(nums); j < n; {
129-
for j+1 < n && nums[j]+1 == nums[j+1] {
130-
j++
125+
func summaryRanges(nums []int) (ans []string) {
126+
f := func(i, j int) string {
127+
if i == j {
128+
return strconv.Itoa(nums[i])
131129
}
132-
res = append(res, make(nums, i, j))
133-
i = j + 1
134-
j = i
130+
return strconv.Itoa(nums[i]) + "->" + strconv.Itoa(nums[j])
135131
}
136-
return res
137-
}
138-
139-
func make(nums []int, i, j int) string {
140-
if i == j {
141-
return strconv.Itoa(nums[i])
132+
for i, j, n := 0, 0, len(nums); i < n; i = j + 1 {
133+
j = i
134+
for j+1 < n && nums[j+1] == nums[j]+1 {
135+
j++
136+
}
137+
ans = append(ans, f(i, j))
142138
}
143-
return strconv.Itoa(nums[i]) + "->" + strconv.Itoa(nums[j])
139+
return
144140
}
145141
```
146142

@@ -149,21 +145,18 @@ func make(nums []int, i, j int) string {
149145
```cs
150146
public class Solution {
151147
public IList<string> SummaryRanges(int[] nums) {
152-
var res = new List<string>();
153-
for (int i = 0, j = 0, n = nums.Length; j < n;)
154-
{
155-
while (j + 1 < n && nums[j] + 1 == nums[j + 1])
156-
{
148+
var ans = new List<string>();
149+
for (int i = 0, j = 0, n = nums.Length; i < n; i = j + 1) {
150+
j = i;
151+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
157152
++j;
158153
}
159-
res.Add(make(nums, i, j));
160-
i = j + 1;
161-
j = i;
154+
ans.Add(f(nums, i, j));
162155
}
163-
return res;
156+
return ans;
164157
}
165158

166-
public string make(int[] nums, int i, int j) {
159+
public string f(int[] nums, int i, int j) {
167160
return i == j ? nums[i].ToString() : string.Format("{0}->{1}", nums[i], nums[j]);
168161
}
169162
}
Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
class Solution {
22
public:
33
vector<string> summaryRanges(vector<int>& nums) {
4-
int n = nums.size();
5-
if (n == 0) {
6-
return {};
7-
}
8-
vector<string> res;
9-
for (int i = 0, j = 0; j < n;) {
10-
while (j + 1 < n && nums[j] + 1 == nums[j + 1]) ++j;
11-
res.push_back(make(nums, i, j));
12-
i = j + 1;
4+
vector<string> ans;
5+
auto f = [&](int i, int j) {
6+
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
7+
};
8+
for (int i = 0, j, n = nums.size(); i < n; i = j + 1) {
139
j = i;
10+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
11+
++j;
12+
}
13+
ans.emplace_back(f(i, j));
1414
}
15-
return res;
16-
}
17-
18-
string make(vector<int>& nums, int i, int j) {
19-
return i == j ? to_string(nums[i]) : to_string(nums[i]) + "->" + to_string(nums[j]);
15+
return ans;
2016
}
2117
};
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
public class Solution {
22
public IList<string> SummaryRanges(int[] nums) {
3-
var res = new List<string>();
4-
for (int i = 0, j = 0, n = nums.Length; j < n;)
5-
{
6-
while (j + 1 < n && nums[j] + 1 == nums[j + 1])
7-
{
3+
var ans = new List<string>();
4+
for (int i = 0, j = 0, n = nums.Length; i < n; i = j + 1) {
5+
j = i;
6+
while (j + 1 < n && nums[j + 1] == nums[j] + 1) {
87
++j;
98
}
10-
res.Add(make(nums, i, j));
11-
i = j + 1;
12-
j = i;
9+
ans.Add(f(nums, i, j));
1310
}
14-
return res;
11+
return ans;
1512
}
1613

17-
public string make(int[] nums, int i, int j) {
14+
public string f(int[] nums, int i, int j) {
1815
return i == j ? nums[i].ToString() : string.Format("{0}->{1}", nums[i], nums[j]);
1916
}
2017
}

0 commit comments

Comments
 (0)