开一个新坑,记录下自己每天的算法练习,希望自己通过1个多月的学习,能够成为算法大神。
下面正式开始新坑。
两个数组的交集
这是牛客上的题,根据题意,我们有多种解法,这题用哈希比较好写。我们可以弄一个bool类型的数组来模拟哈希表。比如让nums1的值放入数组里,然后全为 true。之后,用nums2的值和数组比较,因为有重复的数字,当nums2的值和数组的值相等时,就把这个公共元素放入另一个数组ret,然后让数组里这个值为 false。最后输出ret的值就可以了。
牛客上的代码如下:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums1 int整型vector
* @param nums2 int整型vector
* @return int整型vector
*/
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
bool hash[1010]={0};
vector<int> ret;
for(auto ch:nums1)
{
hash[ch]=true;
}
for(auto ch:nums2)
{
if(hash[ch])
{
ret.push_back(ch);
hash[ch]=false;
}
}
return ret;;
}
};
点击消除
这一题,很像匹配括号那题。所以,我们可以选择用栈的方式。思路如下:假设字符串 abbc 先把a放入栈里面,然后剩下的跟栈顶元素比,如果等于栈顶元素,就把栈顶元素pop出来,不等于就压入栈内,最后栈里面的就是我们需要的结果了。这一道题有个小技巧,因为是字符串,所以可以用string来模拟栈。
牛客的代码如下:
#include <iostream>
using namespace std;
#include <string>
int main() {
string s,ret;
cin>>s;
for(auto& ch:s)
{
if(ret.size()&&ch==ret.back())
{
ret.pop_back();
}
else ret.push_back(ch);
}
if(ret.empty()){
cout<<'0';
}
else cout<<ret;
return 0;
}
最小花费爬楼梯
这题就是一道比较经典的动态规划问题了。
算法思路:我们创建一个dp[]数组表示到i楼的花费。比如 到第3层的花费就是 dp[3]=cost[2]+dp[2]或者是dp[3]=cost[1]+top[1],然后在取最小的值。如此,我们就得到了到n层的最小花费 dp[n]=min(cost[n-1]+dp[n-1],cost[n-2]+dp[n-2])。
牛客代码如下:
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int cost[n];
int dp[n+1];
dp[0]=dp[1]=0;
for(int i=0;i<n;++i) cin>>cost[i];
for(int i=2;i<=n;++i)
{
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
cout<<dp[n];
return 0;
}
今天就分享这三个题吧,我还得再练