目录
一、寻找旋转排序数组中的最小值
二分法
很简单,要找到最小值,而此处的最小值的特点是小于后面的值,大于前面的值,所以只需要不断将high移到上升下降趋势刚好发生变化的地方即可得到答案。
class Solution {
public:
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size() - 1;
while(low <= high){
int mid = low + (high - low) / 2;
if(nums[mid] < nums[high]){
high = mid;
}else{
low = mid + 1;
}
}
return nums[high];
}
};
二、爬楼梯
数学
通过观察可以看出,每一项是前两项之和,所以只要先确定前面两个值,后面的通过不断相加便可以得出答案。
class Solution {
public:
int climbStairs(int n) {
int ans = 0;
int a = 1, b = 2;
if(n == 1)
return 1;
if(n == 2)
return 2;
for(int i = 0; i < n - 2; i++){
ans = a + b;
a = b;
b = ans;
}
return ans;
}
};
动态规划
class Solution {
public:
int climbStairs(int n) {
int dp[46];
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; i++)
dp[i] = dp[i - 1] + dp[i - 2];
return dp[n];
}
};
三、打家劫舍
动态规划
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 1)
return nums[0];
vector<int> dp = vector<int>(nums.size(), 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i = 2; i < nums.size(); i++)
dp[i] = max(nums[i] + dp[i - 2], dp[i - 1]);
return dp[nums.size() - 1];
}
};
四、三角形最小路径和
动态规划
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
vector<vector<int>> dp(triangle.size(), vector<int>(triangle.size()));
dp[0][0] = triangle[0][0];
for(int i = 1; i < triangle.size(); i++){
dp[i][0] = dp[i - 1][0] + triangle[i][0];
for(int j = 1; j < i; j++)
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
dp[i][i] = dp[i - 1][i - 1] + triangle[i][i];
}
return *min_element(dp[triangle.size() - 1].begin(), dp[triangle.size() - 1].end());
}
};