1.语言困惑
- 大括号初始化的问题
vector<int> v1 = {1, 2, 3, 4};
vector<int> v2{1, 2 ,3 ,4};
对于这两种初始化,我一直感觉是一样的,但今天突然脑子一抽,对于第一种方式产生了怀疑,会不会先是构造了一个vector<int> 再给 v1 赋值的。于是我做了测试。
#include <iostream>
using namespace std;
class A
{
public:
A(int a1, int a2, int a3, string tag): tag_(tag){
cout << tag_ << " init!" << endl;
}
A& operator = (const A& other){
cout << other.tag_ << "is copied!" << endl;
return *this;
}
string tag_;
};
int main(){
A a1{1, 2, 4, "a1"};
A a2 = {3, 4, 5, "a2"};
a1 = a2;
return 0;
}
输出结果
a1 init!
a2 init!
a2 is copied!
所以结论,我想多了。
2. leetcode
leetcode 327
题目描述
给定一个整数数组 nums,返回区间和在 之间的个数,包含 和 。
区间和 表示在 nums 中,位置从 到 的元素之和,包含 和 ()。解析
我们前缀数组 和利用AVL Tree 保存,区间和在 之间的话, 既可以转变为(), 我们可以利用 C++ 的 确定界限, 复杂度,不是一个很好的策略code
class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
map<long long, int> pres = {};
pres[0]++;
int size = nums.size();
long long sum = 0;
int res = 0;
for(int i = 0; i < size; i++){
sum += nums[i];
auto begin_iter = pres.lower_bound(sum - upper);
if(begin_iter!=pres.end()){
auto end_iter = pres.upper_bound(sum - lower);
for(auto iter = begin_iter; iter!=end_iter; iter++)
res += iter->second;
}
pres[sum]++;
}
return res;
}
};