vector<int>& nums声明一个动态的数组, results.push_back是对数组赋值
刚刚开始是用两个for循环,但是时间复杂度为n^2,在网上查到了用map写法,果然ACCEPT,所以今天研究一下map函数以及其原因。
TWO SUM 的C++函数如下所示
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {
vector<int> results;
int sum;
map<int,int> hmap;
for(int i=0;i<nums.size();i++){
if(!hmap.count(nums[i])){
hmap.insert(pair<int,int>(nums[i],i));
}
if(hmap.count(target-nums[i])){
int n=hmap[target-nums[i]];
if(n<i){
results.push_back(n+1);
results.push_back(i+1);
}
}
}
return results;
}
};
首先要加上头文件#include<map>
map函数 原理是红黑树
红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
满足二叉树的性质,时间复杂度为O(log n),
但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质:
- 每个结点要么是红的要么是黑的。
- 根结点是黑的。
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
- 如果一个结点是红的,那么它的两个儿子都是黑的。
- 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度,从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)”这一结论成立的原因。