基础算法总结
就两天准备蓝桥杯了,将就写写
#include<iostream>
#include<cstring>
#include<vector>
#include<math.h>
#include<algorithm>
#include<set>
//#include<bit/stdc++.h>
using namespace std;
int test()
{
set<int> st;
st.insert(3);
st.insert(2);
st.insert(1);
st.insert(3);
//注意不支持it<st.end()的写法
for(set<int>::iterator it=st.begin();it!=st.end();it++)
{
cout<<*it<<end;
}
//set自动递增排序,且主动去除重复元素。
}
//标准二分法
int binarySearch(vector<int> &nums, int target)
{
int left=0;
int right=nums.size() -1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
return mid;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
return -1;
}
//返回target左侧边界
int left_Bin(vector<int> &nums, int target)
{
if(nums.size()==0) return -1;
int left=0;
int right=nums.size();
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
right=mid;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else
{
right=mid;
}
}
return left;
}
//返回target右侧边界
int right_Bin(vector<int> &nums, int target)
{
if(nums.size()==0) return -1;
int left=0;
int right=nums.size();
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
{
left=mid+1;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else
{
right=mid;
}
}
return left-1;
}
//贪心
int greed(int k)
{
vector<int> money{100,50,20,10,5,2,1};
int nums=0;
for(int i=0;i<money.size();i++)
{
if(k==0)
{
return nums;
}
else if(k/money[i])
{
nums+=k/money[i];
k=k%money[i];
}
}
return nums;
}
//背包问题
//动态规划-斐波拉契数列
int solution(int n)
{
if(n==0)
{
return 0;
}
else if(n==1)
{
return 1;
}
else
{
int* result= new int[n+1];
result[0]=0;
result[1]=1;
for(int i=2;i<n+1;i++)
{
result[i]=result[i-1]+result[i-2];
}
return result[n];
}
}
//动态规划-数组最大不连续递增序列
int Maxarrayorder(vector<int>& nums)
{
int n=nums.size();
int* temp=new int[n];
for(int i=0;i<n;i++)
{
temp[i]=1;
}
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(nums[i]>nums[j]&&temp[j]+1>temp[i])
{
//如果有a[i]比他前面的数都大
//则temp[i]为它前面的比他小的数的哪一个temp+1取得的最大值
temp[i]=temp[j]+1;
}
}
}
int t=temp[0];
for(int i=1;i<n;i++)
{
t=max(temp[i],t);
}
return t;
}
//动态规划-数组最大连续子序列和
int MaxarraySum(vector<int> nums)
{
int n=nums.size();
int max=nums[0];
int sum=a[0];
for(int i=1;i<n;i++)
{
sum=max(sum+a[i],a[i]);
if(sum>max)
{
max=sum;
}
}
return max;
}
//数字塔从上到下最大路径和
int mathSum(int** nums,int n)
{
int dp[101][101];
dp[0][0]=nums[0][0];
for(int i=1,i<n;i++)
{
for(int j=0;j<i;j++)
{
if(j==0)
{
dp[i][j]=dp[i-1][j]+nums[i][j];
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+nums[i][j];
}
}
}
int m=0;
for(int i=0;i<n;i++)
{
m=max(m,dp[n-1][i]);
}
return m;
}