int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int exgcd(int a, int b, int& x, int& y)
{
if(!b)
{
x = 1, y = 0;
return a;
}
int r = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return r;
}
所以这个题就是判断一下是否c 可以被gcd(a, b) 整除即可,别忘了 x + y <= c这个额外的限制
class Solution {
public:
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
bool canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {
// 好像是扩展欧几里得算法
// ax + by = c 是否有解
if(jug1Capacity + jug2Capacity < targetCapacity) return false;
return targetCapacity % gcd(jug1Capacity, jug2Capacity) == 0;
}
};
367 - 有效的完全平方数
不让用sqrt 就是简单的二分查找 找平方根即可
这里不用担心溢出的问题
class Solution {
public:
bool isPerfectSquare(int num) {
long long l = 1, r = num;
while(l < r)
{
long long mid = l + r >> 1;
if(mid * mid >= num) r = mid;
else l = mid + 1;
}
return r * r == num;
}
};
368 - 最大整除子集
整除是有传递性的,排序后只要保证相邻元素是可整除的即可
然后仿照最大上升子序列问题的dp解决方式来求
class Solution {
public:
vector<int> largestDivisibleSubset(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
vector<int> f(n + 1, 1), g(n + 1, -1);
int maxl = 0, ei = 0;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < i; j++)
if(nums[i] % nums[j] == 0)
if(f[i] < f[j] + 1)
{
f[i] = f[j] + 1;
g[i] = j;
}
if(f[i] > maxl) maxl = f[i], ei = i;
}
vector<int> res;
for(int i = ei; i >= 0; )
{
res.push_back(nums[i]);
i = g[i];
}
return res;
}
};