classSolution{public:int dx[4]={0,1,-1,0};int dy[4]={1,0,0,-1};int m =0;int n =0;intsolve(vector<vector<char>>& grid){int ret =0;
m = grid.size();
n = grid[0].size();for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(grid[i][j]=='1'){
ret++;dfs(grid, i, j);}}}return ret;}voiddfs(vector<vector<char>>& grid,int i,int j){
grid[i][j]='0';for(int k =0; k <4; k++){int x = i + dx[k];int y = j + dy[k];if(x >=0&& x < m && y >=0&& y < n && grid[x][y]=='1'){dfs(grid, x, y);}}}};
算法思路:A 和 B 的最小公倍数 = A * B / 两者的最大公约数。 最大公约数:辗转相除法。
C++ 算法代码:
#include<iostream>usingnamespace std;intgcd(int a,int b){if(b ==0){return a;}returngcd(b, a % b);}intmain(){int a =0;int b =0;
cin >> a >> b;
cout <<(a * b /gcd(a, b))<< endl;return0;}
classSolution{public:intMLS(vector<int>& arr){sort(arr.begin(), arr.end());int n = arr.size();int ret =0;int tmp =1;for(int i =0; i < n -1; i++){if(arr[i +1]- arr[i]==1){
tmp++;if(tmp > ret){
ret = tmp;}}elseif(arr[i +1]- arr[i]==0){continue;}else{
tmp =1;}}return ret;}};
#include<iostream>usingnamespace std;intmain(){
string s;
cin >> s;
string ret;int n = s.size();for(int i =0; i < n; i++){
ret += s[i];if((n - i -1)%3==0&& i != n -1){
ret +=',';}}
cout << ret << endl;return0;}
classSolution{public:intgetLongestPalindrome(string A){int n = A.size();int ret =1;for(int i =0; i < n; i++){// 当⻓度是奇数的时候int left = i -1;int right = i +1;while(left >=0&& right < n && A[left]== A[right]){
left--;
right++;}
ret =max(ret, right - left -1);// 当⻓度是偶数的时候
left = i;
right = i +1;while(left >=0&& right < n && A[left]== A[right]){
left--;
right++;}
ret =max(ret, right - left -1);}return ret;}};
因为只能买卖⼀次,因此,对于第 i 天来说,如果在这天选择卖出股票,应该在 [0, i] 天之内,股票最低点买入股票,此时就可以获得最大利润。
那么,我们仅需维护⼀个前驱最小值的变量,并且不断更新结果即可。
C++ 算法代码:
#include<iostream>usingnamespace std;constint N =1e5+10;intmain(){int n =0;
cin >> n;int prices[N];for(int i =0; i < n; i++){
cin >> prices[i];}int ret =0;int premin = prices[0];for(int i =1; i < n; i++){
premin =min(prices[i], premin);
ret =max(ret, prices[i]- premin);}
cout << ret << endl;return0;}
#include<iostream>#include<vector>usingnamespace std;intabs(int a){if(a <0){return-a;}return a;}intmain(){int n, m, x, y;
cin >> n >> m >> x >> y;
vector<vector<longlong>>dp(n +2,vector<longlong>(m +2));
x +=1;
y +=1;
dp[0][1]=1;for(int i =1; i <= n +1; i++){for(int j =1; j <= m +1; j++){if(i != x && j != y &&abs(i - x)+abs(j - y)==3||(i == x && j == y)){
dp[i][j]=0;}else{
dp[i][j]= dp[i][j -1]+ dp[i -1][j];}}}
cout << dp[n +1][m +1]<< endl;return0;}
#include<iostream>usingnamespace std;intmain(){int n, m, a, b;
cin >> n >> m >> a >> b;longlong ret =0;for(longlong i =0; i <=min(n /2, m); i++){longlong j =min(n - i *2,(m - i)/2);
ret =max(ret, a * i + b * j);}
cout << ret << endl;return0;}
算法思路。简单线性 dp: 维护 i 位置之前,⼀共有多少个 “s” “sh” ,然后更新 “shy” 的个数。
C++ 算法代码:
#include<iostream>usingnamespace std;intmain(){int n =0;
cin >> n;
string str;
cin >> str;longlong s =0;longlong h =0;longlong y =0;for(int i =0; i < n; i++){char ch = str[i];if(ch =='s'){
s++;}elseif(ch =='h'){
h += s;}elseif(ch =='y'){
y += h;}}
cout << y << endl;return0;}