C++入门算法大全!!!
1递归
#include<iostream>
using namespace std;
int f(int n)
{
int res;
if(n==1)
{
res=1;
}
else
{
res=f(n-1)+3;
}
return num;
}
int main()
{
int a;
cin>>a;
cout<<f(a)<<endl;
}

#include<iostream>
using namespace std;
int f(int n)
{
int num;
if(n==1)
{
num=2;
}
else
{
num=f(n-1)*2;
}
return num;
}
int main()
{
int a;
cin>>a;
cout<<f(a)<<endl;
}

#include<iostream>
using namespace std;
int f(int n)
{
int num;
if(n<=1)//include 0 and 1
{
num=1;
}
else
{
num=n*f(n-1);
}
return num;
}
int main()
{
int a;
cin>>a;
cout<<f(a)<<endl;
}
2递推(利用数组)
斐波那契数列
输出n小于五十的斐波那契数列之和
#include<iostream>
using namespace std;
int main()
{
long long arr[60];
arr[1]=1;
arr[2]=1;
long long sum=1;
for(int i=3;i<51;i++)
{
arr[i]=arr[i-1]+arr[i-2];
sum+=arr[i];
}
cout<<sum<<endl;
return 0;
}

#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;//输入层数
int level=1;
long long sum=1;//初始化为1
for(int i=2;i<n+1;i++)//从2开始
{
level = level+i;//后一层比前一层多i,右边先成立,再是左边被赋值
sum+=level;
}
cout<<sum<<endl;
return 0;
}
3二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1。
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;//()不要忘了!!!
while(left<=right)
{
int mid=(right-left)/2+left;//!!!!
int num=nums[mid];
if(num==target)
{
return mid;
//为什么不用break
}
else if(num<target)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
return -1;//会和上面的return冲突吗?
}
};
当两个指针都停下时,a[i] 和 a[j] 都是放错位置的数,交换它们就能让数组更有序。
5动态规划之数塔问题
vector<vector<int>>:一个存放 vector<int> 的 vector,也就是二维数组
#include<iostream>
using namespace std;
int n;
int dp[110][110];
int t[110][110];
void d()
{
for(int j=1;j<n+1;j++)//bottom
{
dp[n][j]=t[n][j];
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=t[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
}
}
cout<<dp[1][1]<<endl;
}
int main()
{
cin>>n;
for(int i=1;i<n+1;i++)
{
for(int j=1;j<i+1;j++)
{
cin>>t[i][j];
}
}
d();
return 0;
}
-
return mid;:直接结束整个函数,并把mid返回给调用者。函数一旦执行return,后面的所有代码都不会执行,不需要也不能再写break。 -
不会冲突。因为:
-
如果循环里找到了目标,
return mid;会立刻结束函数,return -1;永远不会被执行。 -
如果循环全部走完都没找到目标,循环正常退出,然后才会执行
return -1;。 -
4快速排序
-
快速排序的完整过程
-
选基准(你已会)
-
分区:把比基准小的放左边,比基准大的放右边(你已会)
-
递归:对左右两部分分别再做同样的操作,直到每部分只剩一个数
-
class Solution { public: void sortColors(vector<int>& nums) { int p0=0; int p1=0; int n=nums.size(); for(int i=0;i<n;i++) { if(nums[i]==1) { swap(nums[i],nums[p1]); p1++; } else if(nums[i]==0) { swap(nums[i],nums[p0]); if(p0<p1) { swap(nums[i],nums[p1]); } p0++; p1++; } } } }; -
这段代码在干什么?
快速排序的核心是“划分”:选一个基准值
p,把数组分成两部分,左边都 ≤p,右边都 ≥p。你的代码用 两个指针
i和j从两端向中间扫描: -
i从左边开始,找 大于或等于 基准的数(因为while(a[i] < p) i++;遇到 ≥p 就停) -
j从右边开始,找 小于或等于 基准的数(因为while(a[j] > p) j--;遇到 ≤p 就停)
#include<iostream>
using namespace std;
int n;
int dp[110][110];
int t[110][110];
void d()
{
for(int j=1;j<n+1;j++)//bottom
{
dp[n][j]=t[n][j];
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j]=t[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
}
}
cout<<dp[1][1]<<endl;
}
int main()
{
cin>>n;
for(int i=1;i<n+1;i++)
{
for(int j=1;j<i+1;j++)
{
cin>>t[i][j];
}
}
d();
return 0;
}
6动态规划最大子数组和
给定一个整数数组 nums,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
#include<iostream>
using namespace std;
int n;//数组个数
int t[1000];//当前
int dp[1000];//局部最值
int gm;//全部最值
int main()
{
cin>>n;
for(int i=1;i<n+1;i++)
{
cin>>t[i];
}
dp[1]=t[1];
gm=t[1];
for(int i=2;i<n+1;i++)
{
dp[i]=max(dp[i-1]+t[i],t[i]);
gm=max(dp[i],gm);
}
cout<<gm<<endl;
return 0;
}
7冒泡排序
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[1000];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
int tem=a[j];
a[j]=a[j+1];
a[j+1]=tem;
}
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
8选择排序:为第一个位置找合适的人
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[1000];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n-1;i++)//只需比较size-1
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
int tem=a[i];
a[i]=a[j];
a[j]=tem;
}
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
9回文字符串(双指针)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string a;
cin>>a;
int i=0;
int j=a.size()-1;
while(i<j)
{
if(a[i]!=a[j])
{
cout<<"no"<<endl;
return 0;
}
i++;
j--;
}
cout<<"yes"<<endl;
return 0;
}
1. 函数参数是常量指针/引用,且传入的是常量对象
cpp
复制
下载
void print(const string& s) { cout << s; }
int main() {
const string name = "Alice";
print(name); // 如果 print 参数不加 const,这里编译失败
}
考点:只能把 const 对象传给 const 引用/指针参数。不加 const 就无法接收常量实参。
10质数判断 最大公约数
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=2;i*i<=n;i++)//!!!
{
if(n%i==0)
{
cout<<"false"<<endl;
return 0;
}
}
cout<<"true"<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
while(b!=0)//!!
{
int r=a%b;
a=b;
b=r;
}
cout<<a<<endl;//!!
return 0;
}
更多推荐


所有评论(0)