数组问题

42 阅读2分钟

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))  # 输出最大可以取到的金额

这段代码将会计算在给定条件下,员工可以获取到的最高现金金额。