✨今日算法三题
文章目录
1.使用最小花费爬楼梯
题目描述
思路详解
看到这道题,突然觉得和前缀和有些相似,如果我们用一个数组sum[i]来表示到达第i阶需要的花费,每次都取最小,那么到达第i阶的最小消费就是sum[i]。
注意,有个小细节,阶数与数组小标的相互对应要时刻注意。比如第i阶,数组小标为i-1哦。每当做算法题的时候都要考虑对应问题。
看到题中一次可以上一阶或者两阶,那么sum[i]=min(sum[i−1]+cost[i−1],dp[i−2]+cost[i−2])
代码与结果
class Solution { public int minCostClimbingStairs(int[] cost) { int n = cost.length; int prev = 0, curr = 0; for (int i = 2; i <= n; i++) { int next = Math.min(curr + cost[i - 1], prev + cost[i - 2]); prev = curr; curr = next; } return curr; } }
跳跃游戏
题目描述
思路详解
这个题就比较有意思了,好像桌游大富翁,我还挺厉害的,哈哈哈哈,,,直接开干。
仔细看题可得知,数组中的值表示最大跳跃长度,那么我们遍历数组每次都保存当前位置可以到达的最大长度(当前位置下标+数组中的数值),如果有某一次保存的最大可到达长度大于数组长度就表示可以用几次跳跃到达最后。
代码与结果
public class Solution { public boolean canJump(int[] nums) { int n = nums.length; int rightmost = 0; for (int i = 0; i < n; ++i) { if (i <= rightmost) { rightmost = Math.max(rightmost, i + nums[i]); if (rightmost >= n - 1) { return true; } } } return false; } }
只有两个键的键盘
题目描述
思路详解
这个题就比较不容易了,这里采用分解质因数的方法。
设 f[i]表示打印出 ii个 A 的最少操作次数。由于我们只能使用「复制全部」和「粘贴」两种操作,那么要想得到 i 个 A,我们必须首先拥有 j 个 A,使用一次「复制全部」操作,再使用若干次「粘贴」操作得到 i 个A。
那么我们直接对n进行质因数分解,每次保存i表示复制全部次数,最后剩下的不能分解的表示粘贴次数。
代码与结果
class Solution { public int minSteps(int n) { int ans = 0; for (int i = 2; i * i <= n; ++i) { while (n % i == 0) { n /= i; ans += i; } } if (n > 1) { ans += n; } return ans; } }
’
✨总结
今天的题都考察到了数学知识的运用,对于算法来说,数学也很重要。加油!!!