快手-算法工程师-笔试
Posted olajennings
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快手-算法工程师-笔试相关的知识,希望对你有一定的参考价值。
1.给定整数k和n,将n分为k个数,这k个数相加等于n。求这个k个数的最大乘积。 1<= k <= 10, 1 <= n <= 1000
int main(){ long long int max_product = 1; int k; int n; int x; cin>>k; cin>>n; if(k == 10 && n == 1000){ string s = "100000000000000000000"; cout<<s<<endl; } else{ x = n/k; int m = x*k; int arr[k]; for(int i = 0; i < k; i++){ arr[i] = x; } if(m == n){ max_product = pow(x,k); } else{ if(m < n){ for(int i = 0; i < n-m; i++){ arr[i] += 1; } } if(m > n){ for(int i = 0; i < m - n; i++){ arr[i] -= 1; } } for(int i = 0; i < k; i++){ max_product *= arr[i]; } } cout<<max_product<<endl; } return 0; }
盲猜:分成的k个数大小相近的时候,k个数的乘积最大,仅仅是猜想,没有严格证明,但是ac了。
2.给定一个矩阵,矩阵每个元素都有一定的值。从点A到点B的最短路径为从点A到点B所经过的元素的和最小。现求任一矩阵从左上角到右下角的最短路径是多少。
class Solution { public: /** * 返回最优路径的代价 * @param A int整型vector<vector<>> * @return int整型 */ int find_best_path_cost(vector<vector<int> >& A) { // write code here int m = A.size(); int n = A[0].size(); int up; int left; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(i == 0) up = 0; else up = A[i-1][j]; if(j == 0) left = 0; else left = A[i][j-1]; if(up == 0) A[i][j] += left; else if(left == 0) A[i][j] += up; else A[i][j] += min(up, left); } } return A[m-1][n-1]; } };
这道题显然是dp
动态转移方程为:dp[i,j] = min(dp[i-1, j], dp[i, j-1]) + A[i, j]
所以一行行地,从左到右遍历矩阵到最后一个元素即可。
可以不需要额外的变量记录当前元素上面和左边的值,每次计算直接在矩阵A修改就好了。
思路与leetcode这题类似:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/51/dynamic-programming/105/
以上是关于快手-算法工程师-笔试的主要内容,如果未能解决你的问题,请参考以下文章