从零起步看算法(第十六天 5.2)
决定在迷茫的大学时光里,把这条坑继续走下去吧。。。
上面有两道难度比较大的题:幼儿园分玩具和打炉石的题。暂时放一放,继续学习一些基础的内容,换换兴趣。
开始基础数据结构的算法学习。
学校的数据结构讲的比较水,基本等于零基础了。
1.动态数组
1.一维
//动态数组
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);//[1,2,3]
vec[0]=3;//vec的赋值
//从零的开始的数组
vec[1]=3;
//末尾弹出
vec.pop_back();
//vector 的清除
// vec.clear();
for(int i=0;i<vec.size();i++){//vec.size()
cout<<vec[i]<<endl;//vec[]同数组
}
//vector的内存回收
// {
// vector<int> x;
// vec.swap(x);
// }
//vector的二维使用
return 0;
}
2.二维数组
#include <iostream>
#include<vector>
using namespace std;
int main() {
vector<int>v;
for(int i=1;i<=10;i++){
v.push_back(i*i);
}
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;
vector<vector<int> > v2d;
for(int i=0;i<5;i++){
v2d.push_back(vector<int>());
}
for(int i=0;i<v2d.size();i++){
for(int j=0;j<5;j++){
v2d[i].push_back(i*j);
}
}
for(int i=0;i<v2d.size();++i){
for(int j=0;j<v2d[i].size();++j){
cout<<v2d[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
3.//打印锯齿矩阵
水题一道;
#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<assert.h>
using namespace std;
int main(){
vector<vector<int> > v2;
int n,m;
cin>>n>>m;
int maxn;
maxn=max(n,m);
for(int i=0;i<maxn;i++){
v2.push_back(vector<int>());
}
while(m--){
int x,y;
cin>>x>>y;
v2[x-1].push_back(y);
}
for(int i=0;i<v2.size();i++){
if(!v2[i].size()){
cout<<endl;
continue;
}
for(int j=0;j<v2[i].size();j++)
{
if(j!=0)
cout<<" ";
cout<<v2[i][j];
}
cout<<endl;
}
return 0;
}
4.堆积木
本题还是有一些小知识点,很新颖。
1.二维数组的第二种定义方法
2.整行的清除方法
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<int> v[n+10];//二维数组的新开方法
//n+10行
//多开一个
for(int i=0;i<=n;i++){
v[i].push_back(i);
}
while(m--){
int x,y;
cin>>x>>y;
if(x==y)
continue;
for(int j=0;j<v[y].size();j++){
v[x].push_back(v[y][j]);
}
vector<int> xp;//整行清除
{
v[y].swap(xp);
}
}
for(int i=1;i<=n;i++){//size()不能用于已知的长度
for(int j=0;j<v[i].size();j++){//行和列不一样
if(j!=0)cout<<" ";
cout<<v[i][j];
}
cout<<endl;
}
return 0;
}