目录
climbing-stairs(动态规划,简单)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
示例 1:
输入: 2 输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3 输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思路
完整code
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
if (n <= 2) {
return dp[n];
}
else
{
for (int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
}
return dp[n];
}
};
reverse-integer(进位,简单)
思路
完整code
class Solution {
public:
int reverse(int x)
{
int absRe=0;
int tmp=abs(x);
while(tmp)
{
absRe=absRe*10+tmp%10;
tmp/=10;
}
return x>=0?absRe:-absRe;
}
};
permutations(全排列,简单)
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
主要是用的这个next_permutation函数
https://blog.csdn.net/HowardEmily/article/details/68064377
完整code
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> res;
vector<int> vec=num;
do
{
res.push_back(num);
next_permutation(num.begin(),num.end());
}while(num!=vec);
return res;
}
};
powx-n(分治,二分法,简单)
请实现函数 pow(x, n).
思路
直到n无限接近0的时候,停止。
完整code
class Solution {
public:
double pow(double x, long long n) {
if (n < 0)
{
x = 1 / x;
n = -n;
}
if (n == 0) {
return 1.0;
}
double half = pow(x, n / 2);
if (n % 2 == 0) {
return half * half;
}
else {
return half * half * x;
}
}
};
sqrtx(分治,简单)
实现函数 int sqrt(int x).计算并返回x的平方根
思路
这个叫牛顿法迭代。
完整code
class Solution {
public:
int sqrt(int x) {
if (x == 0) return 0;
double last = 0;
double res = 1;
while (res != last)
{
last = res;
res = (res + x / res) / 2;
}
return int(res);
}
};