开一个新坑,记录下自己每天的算法练习,希望自己通过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;}
今天就分享这三个题吧,我还得再练