三个题全是Leetcode原题,按照考场老师的说法今年的机试算是简单的了
674. 最长连续递增序列
leecode原题 https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if(nums.size()==0)return 0;
vector<int>dp(nums.size()+1,1);
int ans=1;
for(int i=1;i<nums.size();++i){
if(nums[i]>nums[i-1])dp[i]=max(dp[i],dp[i-1]+1);
ans=max(ans,dp[i]);
}
return ans;
}
};
983. 最低票价
leetcode原题 https://leetcode-cn.com/problems/minimum-cost-for-tickets/
正推法
class Solution {
public:
int mincostTickets(vector<int>& days, vector<int>& costs) {
vector<int>dp(days.size()+1);
int m=min(costs[0],min(costs[1],costs[2]));
for(int i=1;i<=days.size();++i){
dp[i]=min(i*m,dp[i-1]+m);
for(int j=1;j<=6;++j){
if(i-j-1>=0&&days[i-1]-days[i-j-1]<=6)dp[i]=min(dp[i],dp[i-j-1]+costs[1]);
}
for(int j=1;j<=29;++j){
if(i-j-1>=0&&days[i-1]-days[i-j-1]<=29)dp[i]=min(dp[i],dp[i-j-1]+costs[2]);
}
//cout<<i<<' '<<dp[i]<<endl;
}
return dp[days.size()];
}
};
倒推法:
当前状态是否最优与后面的元素有关,所以可以使用倒推法规避后面元素的干扰
class Solution {
public:
int mincostTickets(vector<int>& days, vector<int>& costs) {
int m=min(costs[0],min(costs[1],costs[2]));
int dp[400],vis[400];
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
for(int x:days){
vis[x]=1;
}
for(int i=days[days.size()-1];i>=0;--i){
if(vis[i]){
dp[i]=min(dp[i+1]+costs[0],min(dp[i+7]+costs[1],dp[i+30]+costs[2]));
}else dp[i]=dp[i+1];
}
return dp[0];
}
};
996. 正方形数组的数目
leetcode原题 https://leetcode-cn.com/problems/number-of-squareful-arrays/
考场上写的会超时的版本,能过一半,满足我的个人追求了
50 / 76 个通过测试用例
class Solution {
public:
bool isSq(vector<int>& A){
for(int i=1;i<A.size();++i){
int sum=A[i-1]+A[i];
int sq=sqrt(sum);
if(sq*sq!=sum)return false;
}
return true;
}
int numSquarefulPerms(vector<int>& A) {
sort(A.begin(),A.end());
int ans=0;
do{
if(isSq(A))ans++;
}while(next_permutation(A.begin(),A.end()));
return ans;
}
};
我的刷题笔记
https://github.com/sherpahu/AlgorithmsNotes
梳理了STL的用法,整理了常考的知识点(DP、图论等),如果觉得对你有帮助,不妨给我一个star 😃