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. 使用最小花费爬楼梯

LeetCode746. 使用最小花费爬楼梯(C++)

leetcode 746. 使用最小花费爬楼梯----动态规划篇

Leetcode算法初学——动态规划算法“使用最小花费爬楼梯”

LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)