NC151 最大公约数 牛客题霸(辗转相除法)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求出a、b的最大公约数。
* @param a int
* @param b int
* @return int
*/
int gcd(int a, int b) {
// write code here
return b == 0 ? a : gcd (b, a % b);
}
};
NC105 二分查找-II 牛客题霸
- 二分的思想,我之前写过一篇博客,可以参照一下基础算法
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 如果目标值存在返回下标,否则返回 -1
* @param nums int整型vector
* @param target int整型
* @return int整型
*/
int search(vector<int>& nums, int target) {
// write code here
if (nums.size() == 0) return -1;
int l = 0;
int r = nums.size() - 1;
while (l < r) {
int mid = l + (r - l) / 2; //防止溢出
//数组升序排列
// 若是q[mid]的值比x大 ,则x在左半边,r = mid
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
if (nums[r] != target) r = -1;
return r;
}
};
NC65 斐波那契数列 牛客题霸
一、 NC 65
- 在递归的过程中,越往下走,重复计算的数就越多;
- 记忆化搜索算法
class Solution {
public:
int Fibonacci(int n) {
// 用递归很慢,这里我们可以考虑把中间的值存下来,不用重复计算,dp数组
int dp[105];
dp[1] = 1; // 初始化斐波那契数列,这里我让下标从1开始,比较好算
dp[2] = 1;
if (n < 3) {
return 1;
} else {
for (int i = 3; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
};
二、矩阵快速幂解法
- 同理我们是可以用这样的思想去快速求矩阵幂的,在矩阵相乘的部分可以自定义一个结构体,补充矩阵乘法代码;
- 可以当成一个模板背一下;
int quick_pow(int a, int n) {
int res = 1;
while (n > 0) {
// 若 n ,位上还有值,就继续走
if (n & 1) res = res * a;
a *= a;
n >>= 1;
}
return res;
}