因为种种原因开始使用 C++ 刷 leetcode ,在此记录刷题过程中不断回忆的 C++ 知识点。
vector的使用
1.创建一维的vector
vector<int> v; //创建容器v,未指定容量
vector<int> v(10); //创建容量为10的容器
vector<int> v(10,2); //创建容量为10的容器,并将每个元素初始化为2
2.创建二维的vector
(1) vector<vector<int>> res(r,vector<int>(c,0))
(2)使用resize控制大小
vector<vector<int>> res;
res.resize(r);
for(int k=0;k<r;++k)
res[k].resize(c);
3.将一个vector赋值给另一个vector
(1)声明 vector<int> v1(v2)
(2)使用assign赋值, v1.assign(v2.begin(),v2.end())
4.基本操作
(1)头文件 #include<vector>
(2)创建vector vector<int> vec;
(3)在尾部插入元素 vec.push_back(a);
(4)使用下标访问元素 vector[0]
(5)使用迭代器访问元素
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
//对元素的操作
}
(6)插入元素 vec.insert(vec.begin()+i,a); //在第i个元素的位置插入a
(7)删除元素 vec.erase(vec.begin()+2); //删除第3个元素
(8)向量大小 vec.size();
(9)清空 vec.clear();
5.算法 #include<alogrithm>
(1)翻转vector reverse(vec.begin(),vec.end());
(2)排序 sort(vec.begin(),vec.end()); //默认按照升序
(3)可以重新比较函数
bool Comp(const int&a,cnst int&b){
return a>b;
}
sort(vec.begin(),vec.end(),Comp); //降序
在建立树的过程中遇到的问题
struct Node{
int val;
int count=1; //记录这个数有多少个
Node* left=NULL;
Node* right=NULL;
Node(int val):val(val){}
};
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
vector<int> res(nums.size(),0);
if(nums.size()==0) return res;
Node* root=new Node(nums[0]);
for(int i=1;i<nums.size();i++){
Node* temp=root;
while(temp!=NULL){
if(temp->val==nums[i]){
++temp->count;
break;
}
else if(temp->val > nums[i]){
temp=temp->left;
}
else{
temp=temp->right;
}
}
if(temp==NULL){
temp=new Node(nums[i]);
}
}
}
int getRes(Node* root,int val){
//无关
}
};
在这道题目中很想当然的想法:搜索树,当指针指向NULL时给指针new一个新值,这样就将节点插入到树中了。
然而事实是:指针指向NULL时的地址为0x00000000,并没有分配地址空间,赋值时又重新分配了地址空间。
个人感觉正确的写法是:给left或right赋值,或在节点初始化的时候分配地址空间。
#include<iostream>
#include<vector>
using namespace std;
struct Node {
int val;
int count = 1; //记录这个数有多少个
Node* left = NULL;
Node* right = NULL;
Node(int val) :val(val) {}
};
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
//我就知道暴力法会超时
//归并排序,和求解逆序对数比较像
//归并排序也超时
//另一个方法:建立二叉搜索树
vector<int> res(nums.size(), 0);
if (nums.size() == 0) return res;
Node* root = new Node(nums[0]);
for (int i = 1;i<nums.size();i++) {
Node* temp = root;
while (temp != NULL) {
if (temp->val == nums[i]) {
++temp->count;
break;
}
else if (temp->val > nums[i]) {
if (temp->left == NULL) {
temp->left = new Node(nums[i]);
break;
}
else {
temp = temp->left;
}
}
else {
if (temp->right == NULL) {
temp->right = new Node(nums[i]);
}
else {
temp = temp->right;
}
}
}
}
return res;
}
};