@@ -134,23 +134,22 @@ public:
134
134
* /
135
135
vector<int > subarraySum(vector<int > nums){
136
136
vector<int > result;
137
+ if (nums.empty()) {
138
+ return result;
139
+ }
137
140
138
- int curr_sum = 0;
139
- vector<pair<int, int> > sum_i;
140
- sum_i.push_back(make_pair(0, 0));
141
- for (int i = 0; i != nums.size(); ++i) {
142
- curr_sum += nums[i];
143
- sum_i.push_back(make_pair(curr_sum, i + 1));
141
+ const int num_size = nums.size();
142
+ vector<pair<int, int> > sum_index(num_size + 1);
143
+ for (int i = 0; i != num_size; ++i) {
144
+ sum_index[i + 1].first = sum_index[i].first + nums[i];
145
+ sum_index[i + 1].second = i + 1;
144
146
}
145
147
146
- // sort(sum_i.begin(), sum_i.end(), sort_pair_first());
147
- sort (sum_i.begin(), sum_i.end());
148
- for (int i = 1; i < sum_i.size(); ++i) {
149
- if (sum_i[ i] .first == sum_i[ i - 1] .first) {
150
- int min_index = min(sum_i[ i - 1] .second, sum_i[ i] .second);
151
- int max_index = max(sum_i[ i - 1] .second, sum_i[ i] .second) - 1;
152
- result.push_back(min_index);
153
- result.push_back(max_index);
148
+ sort (sum_index.begin(), sum_index.end());
149
+ for (int i = 1; i < num_size + 1; ++i) {
150
+ if (sum_index[ i] .first == sum_index[ i - 1] .first) {
151
+ result.push_back(sum_index[ i - 1] .second);
152
+ result.push_back(sum_index[ i] .second - 1);
154
153
return result;
155
154
}
156
155
}
@@ -162,9 +161,7 @@ public:
162
161
163
162
### 源码分析
164
163
165
- 没啥好分析的,注意好边界条件即可。按道理对`pair`排序后即为我们需要的排序结果,可以不必先求出`min_index`和`max_index`,即可直接用`sum_i[i - 1].second`代替`min_index`,`sum_i[i].second - 1`代替`max_index`,但实际运行发现先求得`min_index`和`max_index`反而更快!不适用`min()`和`max()`要1700ms,而用了`min()`和`max()`后反而只要1500ms !
166
-
167
- 这种排序的方法需要先求得所有子串和然后再排序,最后还需要遍历排序后的数组,效率自然是比不上哈希表。
164
+ 没啥好分析的,注意好边界条件即可。这里采用了链表中常用的「dummy」节点方法,`pair`排序后即为我们需要的排序结果。这种排序的方法需要先求得所有子串和然后再排序,最后还需要遍历排序后的数组,效率自然是比不上哈希表。但是在某些情况下这种方法有一定优势。
168
165
169
166
### 复杂度分析
170
167
0 commit comments