前言
一个本硕双非的小菜鸡,备战24年秋招,计划刷完hot100和剑指Offer的刷题计划,加油!
根据要求,每一道题都要写出两种以上的解题技巧。
一、279. 完全平方数(HOT100)
279. 完全平方数
Note:动态规划
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, INT_MAX);
//1. 确定dp数组(dp table)以及下标的含义
//dp[j]:和为j的完全平方数的最少数量为dp[j]
//2. 确定递推公式
//dp[j] = min(dp[j], dp[j - i * i] + 1)
//3. dp数组如何初始化
dp[0] = 0;
//4. 确定遍历顺序
for (int i = 1; i * i <= n; i++) {
for (int j = i * i; j <= n; j++) {
dp[j] = min(dp[j], dp[j - i * i] + 1);
}
}
//5. 举例推导dp数组
return dp[n];
}
};
Note:数学方法(涨知识了)
拉格朗日四平方和定理:一个数字可以写成四个数的平方和
勒让德三平方和定理:n!=4^a*(8b+7),那么必然可以写成三数之和。是一个当且仅当的关系。
所以先排掉返回是4的,然后再排掉1和2,最后剩下的就是3
class Solution {
public:
int numSquares(int n) {
while (n % 4 == 0)
n /= 4;
if (n % 8 == 7)
return 4;
for (int a = 0; a * a <= n; ++a) {
int b = sqrt(n - a * a);
if (a * a + b * b == n) {
return !!a + !!b;
}
}
return 3;
}
};
二、6. 从尾到头打印链表(剑指Offer)
Note:使用栈作为辅助
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
stack<int> stk;
ListNode* pNode = head;
while (pNode != nullptr) {
stk.push(pNode->val);
pNode = pNode->next;
}
int sizes = stk.size();
vector<int> res(sizes);
for (int i = 0; i < sizes; i++) {
res[i] = stk.top();
stk.pop();
}
return res;
}
};
Note:翻转数组
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
vector<int> res;
while (head != nullptr) {
res.push_back(head->val);
head = head->next;
}
reverse(res.begin(), res.end());
return res;
}
};
总结
祝大家都能学有所成,找到一份好工作!