leetcode每日一题
- 746.使用最小花费爬楼梯
- 162.寻找峰值
从2023年12月17日开始打卡~持续更新
746.使用最小花费爬楼梯
2023/12/17
代码
- 解法一
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 0;
for(int i = 2;i <= n;i++){
dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
}
- 解法二(优化空间)
class Solution {
public int minCostClimbingStairs(int[] cost) {
int dp1 = 0;
int dp2 = 0;
for(int i = 2;i <= cost.length;i++){
int dpi = Math.min(cost[i-1]+dp2,cost[i-2]+dp1);
dp1 = dp2;
dp2 = dpi;
}
return dp2;
}
}
分析
-
确定dp数组的含义
- 到达第
i
个台阶需要花费的价格为dp[i]
- 到达第
-
确定递推公式
- 上一个台阶,
dp[i] = dp[i-1]+cost[i-1]
- 上两个台阶,
dp[i] = dp[i-2]+cost[i-2]
- 上一个台阶,
-
初始化dp
- 根据题意 第一步不需要花钱所以,
dp[0] = 0,dp[1]=0
- 根据题意 第一步不需要花钱所以,
-
解法二
- 递推公式本来就是根据
cost
数组得来的,只需要记录一下前两位的值并且更新就行了。
- 递推公式本来就是根据
162.寻找峰值
2023/12/18
代码
- 直接找最大值
class Solution {
public int findPeakElement(int[] nums) {
int maxIndex = 0;
for(int i = 1;i<nums.length;i++){
if(nums[i] > nums[maxIndex]){
maxIndex = i;
}
}
return maxIndex;
}
}
- 模拟
class Solution {
public int findPeakElement(int[] nums) {
int n = nums.length;
for(int i = 0;i < n;i++){
boolean ok = true;
if(i - 1 >= 0){
if(nums[i-1] >= nums[i]) ok = false;
}
if(i + 1 < n){
if(nums[i+1] >= nums[i]) ok = false;
}
if(ok) return i;
}
return -1;
}
}
- 二分
class Solution {
public int findPeakElement(int[] nums) {
int l = 0;
int r = nums.length - 1;
while(l < r){
int mid = (l+r)/2;
if(nums[mid] < nums[mid+1]) l = mid + 1;
else r = mid;
}
return r;
}
}