动态规划面试算法题
https://blog.csdn.net/qq_41277628/article/details/113322136
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
1 #include <stdio.h> 2 3 #define N 6 4 5 int main() 6 { 7 int min,temp; 8 int a[] = {7,1,5,3,6,4}; 9 min = a[0]; 10 temp = 0; 11 for(int i = 0;i<N;i++) 12 { 13 if(a[i] < min) 14 { 15 min = a[i]; 16 } 17 else if((a[i]-min)>temp) 18 { 19 temp = a[i] - min; 20 } 21 } 22 printf("最高收益为%d元\n",temp); 23 24 return 0; 25 }
2.盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
https://violentayang.blog.csdn.net/article/details/123061036
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 9 5 6 int main() 7 { 8 int a[N] = {1,8,6,2,5,4,8,3,7}; 9 int i = 0,j = N-1,sun = 0,top = 0; 10 while(i<j) 11 { 12 if(a[i]<a[j]) 13 { 14 sun = (j-i)*a[i]; 15 if(sun>top) 16 { 17 top = sun; 18 } 19 i++; 20 } 21 else 22 { 23 sun = (j-i)*a[j]; 24 if(sun>top) 25 { 26 top = sun; 27 } 28 j--; 29 } 30 } 31 printf("可以盛%d吨的水\n",top); 32 33 return 0; 34 }
c++实现:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 class node{ 6 public: 7 int maxsrea(vector<int>& height){ 8 int ans = 0; 9 int l = 0,r = height.size()-1; 10 while(l<r){ 11 ans = max(ans,min(height[l],height[r]) * (r-l)); 12 if(height[l] < height[r]) l++; 13 else r--; 14 } 15 return ans; 16 } 17 }; 18 19 int main() 20 { 21 node n; 22 vector<int> height = {1,8,6,2,5,4,8,3,7}; 23 cout << n.maxsrea(height) << endl; 24 25 return 0; 26 }
3.不同路径
一个机器人位于一个 m x n 网格的左上角 。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
问总共有多少条不同的路径?
https://blog.csdn.net/C_chengxuyuan/article/details/119980859
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int x,y; 7 int a[100][100]; 8 printf("输入网格的长和宽\n"); 9 scanf("%d%d",&x,&y); 10 11 for(int i = 0;i<x;i++) 12 { 13 a[i][0] = 1; 14 } 15 16 for(int j = 0;j<y;j++) 17 { 18 a[0][j] = 1; 19 } 20 21 for(int i = 1;i<x;i++) 22 { 23 for(int j = 1;j<y;j++) 24 { 25 a[i][j] = a[i-1][j] + a[i][j-1]; 26 } 27 } 28 29 printf("长和宽为%d,%d的网格,总共有%d条不同的路径\n",x,y,a[x-1][y-1]); 30 31 return 0; 32 }
c++实现:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class node{ 6 public: 7 int uniquePath(int m,int n){ 8 vector<vector<int>> f(m,vector<int>(n,1)); 9 for(int i = 1;i<m;i++){ 10 for(int j = 1;j<n;j++){ 11 f[i][j] = f[i-1][j] + f[i][j-1]; 12 } 13 } 14 return f[m-1][n-1]; 15 } 16 }; 17 18 int main() 19 { 20 int y = 3,x = 7; 21 node n; 22 cout << "长为7,宽为3的网格从左上角到右下角的路径有:" << n.uniquePath(x,y); 23 24 return 0; 25 }
不同路径中间有障碍物(力扣第63题)
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 class node{ 6 public: 7 int unique(vector<vector<int>>& o){ 8 int m = o.size(),n = o[0].size(); 9 vector<vector<int>> f(m,vector<int>(n)); 10 for(int i = 0;i<m;i++){ 11 for(int j = 0;j<n;j++){ 12 if(o[i][j] == 1) continue; 13 if(!i&&!j) f[i][j] = 1; 14 else{ 15 if(i) f[i][j] += f[i-1][j]; 16 if(j) f[i][j] += f[i][j-1]; 17 } 18 } 19 } 20 return f[m-1][n-1]; 21 } 22 }; 23 24 int main() 25 { 26 node n; 27 vector<vector<int>> cur; 28 cur.push_back({0,0,0}); 29 cur.push_back({0,1,0}); 30 cur.push_back({0,0,0}); 31 cout << n.unique(cur) << endl; 32 33 return 0; 34 }
4.最小路径和
一个机器人位于一个 m x n 网格的左上角 ,m x n的网格中分布着不同的数字
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,找出路径的最小和。
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 3 5 #define M 3 6 7 int main() 8 { 9 int a[N][M] = {{1,3,1},{1,5,1},{4,2,1}}; 10 int b[100][100]; 11 12 b[0][0] = a[0][0]; 13 14 for(int i = 1;i<N;i++) 15 { 16 b[i][0] = b[i-1][0] + a[i][0]; 17 } 18 19 for(int j = 1;j<M;j++) 20 { 21 b[0][j] = b[0][j-1] + a[0][j]; 22 } 23 24 for(int i = 1;i<N;i++) 25 { 26 for(int j = 1;j<N;j++) 27 { 28 b[i][j] = (b[i-1][j] > b[i][j-1] ? b[i][j-1]:b[i-1][j])+a[i][j]; 29 } 30 } 31 32 printf("长和宽为%d,%d的网格,最小路径和为%d\n",N,M,b[N-1][M-1]); 33 34 return 0; 35 }
5.最长上升子序列
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN),我们可以得到一些上升的子序列(ai1,ai2,...,aiK),
这里1≤i1 < i2 < ... < iK≤N。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
1 #include <stdio.h> 2 #include <string.h> 3 4 #define N 7 5 6 int main() 7 { 8 int max = 0; 9 int a[N],dp[N]; 10 printf("输入一个数组\n"); 11 for(int i = 1;i<=N;i++) 12 { 13 scanf("%d",&a[i]); 14 } 15 16 for(int i = 0;i<N;i++) 17 { 18 dp[i] = 1; 19 } 20 21 for(int i = 1;i<=N;i++) 22 { 23 for(int j = i-1;j>0;j--) 24 { 25 if(a[i]>a[j]&&dp[j]>=dp[i]) 26 { 27 dp[i] = dp[j]+1; 28 if(dp[i]>max) 29 { 30 max = dp[i]; 31 } 32 } 33 } 34 } 35 printf("最长上升子序列的长度为%d\n",max); 36 37 return 0; 38 }
6.最接近的三数之和(力扣16题)
1 #include <iostream> 2 #include <vector> 3 #include<algorithm> 4 using namespace std; 5 6 class node{ 7 public: 8 int threesun(vector<int>& nums,int target){ 9 int ans = nums[0] + nums[1] + nums[2]; 10 sort(nums.begin(),nums.end()); 11 for(int i = 0;i<nums.size();i++){ 12 int l = i + 1,r = nums.size() - 1; 13 while(l<r){ 14 int sum = nums[i] + nums[l] + nums[r]; 15 if(sum == target) return sum; 16 if(abs(sum-target) < abs(ans-target)) ans = sum; 17 if(sum < target) l++; 18 else r--; 19 } 20 } 21 return ans; 22 } 23 }; 24 25 int main() 26 { 27 node n; 28 vector<int> cur = {-1,2,1,-4}; 29 cout << n.threesun(cur,1) << endl; 30 31 return 0; 32 }
浙公网安备 33010602011771号