LeetCode210510使用最小花费爬楼梯和寻找数组中心下标
Posted 程序彤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode210510使用最小花费爬楼梯和寻找数组中心下标相关的知识,希望对你有一定的参考价值。
使用最小花费爬楼梯
动态规划法:
- 额外声明一个dp数组,用于存放每轮循环对应的一个位置上的最小花费(最优解)
- 由于可以选择下标为0或1的位置作为起始楼梯,故dp数组中的第一个位置和第二个位置上的最小花费均为0,因为无需付出任何代价即能从这两个位置任意开始
- 指针i从2即第三个位置开始,若想到达第三个位置,可以从第二个位置走一步到达,也可以从第一个位置走两步到达。但选择第一个位置还是第二个位置
- 是需要根据这个位置上的花费数决定,哪个位置上的花费数更小,就选哪个位置。即当前dp[i]的最小花费为第前两步的最小花费+第前两步的过路费与
- 第前一步的最小花费+第前一步的过路费,取最小。最后取出dp数组中最后一个位置上的元素即为遍历结束后的最小花费。
public static int method(int[] cost){
int n = cost.length;
int[] dp = new int[n+1];
dp[0] = dp[1] = 0; // 可从下标为0/1的位置作为起始台阶
for (int i = 2; i <= n; i++) { // 这里的dp共n+1个数,遍历到等于n时,0到包括n共n+1个数的长度
dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n]; // 很少有数组dp[n]位置上还有数哦~
}
寻找数组中心下标
思路
- 先对数组进行求和,使用Arrays工具的stream()方法的sum()方法进行数组求和,再遍历当前数组,假设每轮遍历到的当前数即为中心数,
- 如果中心右边的和等于中心左边的和,则找到了中心的下标。总和减去当前中心数再减去左边的和,这个左边的和即为迭代前的sum值,
- sum值总是需要迭代,即左边的和会越来越大,每轮只需拍段右边的和是否等于左边的和即可,若右=左,则输出当前位置的下标即可得到中心下标
public static int method(int[] arr){
int total = Arrays.stream(arr).sum(); // 对数组进行求和
int n = arr.length;
int sum = 0;
for (int i = 0;i<n;i++){
// 假设遍历到的当前数即为中心数
if (sum == total - arr[i] - sum) { // 如果中心右边的和等于中心左边的和,则找到了中心的下标。总和减去当前中心数再减去左边的和
return i;
}
sum+=arr[i]; // 左边的和不断增大。
}
return -1;
}
以上是关于LeetCode210510使用最小花费爬楼梯和寻找数组中心下标的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 746. 使用最小花费爬楼梯
LeetCode Algorithm 746. 使用最小花费爬楼梯
leetcode 746. 使用最小花费爬楼梯----动态规划篇