1/给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
class Solution {
public:
bool canJump(vector& nums) {
int n = nums.size();
int rightmost = 0;
for (int i = 0; i < n; ++i) {
if (i <= rightmost) {
rightmost = max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
}
};
2/58集团组织公司年会,其中有一项特殊的抽奖环节,有N个盒子,每个盒子内放有一定量的现金,员工可以取盒子中的现金,取到的现金归自己所有,取的次数和盒子数不限,但是最终结果不允许有盒子是相邻的,如果从两个相邻的盒子中取,所有取到的现金都要归还。
现在给定一个代表每个盒子中现金数目的非负整数数组,请编程计算员工可以获取到最高现金金额。 这个问题可以看作是一个动态规划问题,类似于打家劫舍问题。由于不能从相邻的盒子中取钱,我们可以用一个数组来记录到每个盒子为止可以取到的最大金额。
假设数组表示盒子中的现金为 box[],并且数组的大小为 N。我们可以创建一个动态规划数组 dp[N],其中 dp[i] 表示在考虑前 i 个盒子时,不违反规则可以获取的最大金额。
状态转移方程如下:
- 如果我们取第
i个盒子的钱,那么第i-1个盒子就不能取,此时可以得到的金额为box[i] + dp[i-2](如果i-2是负数,那么就是box[i])。 - 如果我们不取第
i个盒子的钱,那么可以得到的金额就是dp[i-1]。
所以,dp[i] 应该是这两个选择中的最大值:
dp[i] = max(dp[i-1], box[i] + (dp[i-2] if i > 1 else 0))
下面是解决这个问题的 Python 代码:
def max_money(box):
N = len(box)
if N == 0:
return 0
if N == 1:
return box[0]
if N == 2:
return max(box)
# 初始化动态规划数组
dp = [0] * N
dp[0] = box[0] # 第一个盒子
dp[1] = max(box[0], box[1]) # 前两个盒子的最大值
# 填充动态规划数组
for i in range(2, N):
# 选取当前盒子或者不选取当前盒子
dp[i] = max(dp[i-1], box[i] + dp[i-2])
return dp[-1] # 返回最后一个盒子的最大金额
# 示例
cash_boxes = [1, 2, 3, 1] # 盒子中的现金
print(max_money(cash_boxes)) # 输出最大可以取到的金额
这段代码将会计算在给定条件下,员工可以获取到的最高现金金额。