按要求补齐数组(贪心、数组)和最大间距(数组、桶排序)

在这里插入图片描述

题目1

  给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

示例 1:
  输入: nums = [1,3], n = 6
  输出: 1
  解释:根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3],[1,2,3]。其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。所以我们最少需要添加一个数字。

示例 2:
  输入: nums = [1,5,10], n = 20
  输出: 2
  解释: 我们需要添加 [2, 4]。

示例 3:
  输入: nums = [1,2,2], n = 5
  输出: 0

选项

选项A

class Solution {
    public int minPatches(int[] nums, int n) {
        int patches = 0, i = 0;
        long miss = 1;
        while (miss <= n) {
            if (i < nums.length && nums[i] <= miss)
                miss += nums[i++];
            else {
                miss += miss;
                patches++;
            }
        }
        return patches;
    }
}

选项B

class Solution {
    public int minPatches(int[] nums, int n) {
        int patches = 0, i = 0;
        long miss = 1;
        while (miss == n) {
            if (i < nums.length && nums[i] > miss)
                miss += nums[i++];
            else {
                miss += miss;
                patches++;
            }
        }
        return patches;
    }
}

选项C

class Solution {
    public int minPatches(int[] nums, int n) {
        int patches = 0, i = 0;
        long miss = 1;
        while (miss < n) {
            if (i < nums.length && nums[i] <= miss)
                miss += nums[i++];
            else {
                miss += miss;
                patches++;
            }
        }
        return patches;
    }
}

选项D

以上都不对

分析

  1、理解题目:从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。即[1, n]区间内任选一个数x,必须存在nums中任意个数数字的和等于x。然后输出满足上述要求的最少需要补充的数字个数。
注意:这里要理解nums中的数字可以有重合,但是每次计算,每个数只能计算它出现的次数。不然直接n个1等于n了。
  2、理解一下示例2。nums = [1,5,10], n = 20。即1-20之间的数必须存在nums中的任意数字和。根据 nums 里现有的组合 [1], [5], [10], [1,5], [5,10], [1,10], [1,5,10],可以得出 1, 5, 6, 10, 11, 15, 16。现在如果我们将 4 添加到 nums 中,其和可以表示数字 1, 4, 5, 6, 9, 10, 11, 14, 15, 16, 19, 20,现在如果我们将 2和4 添加到 nums 中,其和可以表示数字 1,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,能够覆盖 [1, 20] 区间里所有的数。所以我们最少需要添加两个数字。
  3、看选项代码,很明显选择A。B中miss == n和C中miss < n明显考虑有误。

题目2

  给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。

示例 1:
  输入: [3,6,9,1]
  输出: 3
  解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:
  输入: [10]
  输出: 0
  解释: 数组元素个数小于 2,因此返回 0。

  说明:你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。

选项

  很简单,直接把正确选项给列出来,不做分析了。

class Solution {
    public int maximumGap(int[] nums) {
        int len = nums.length;
        Arrays.sort(nums);
        int temp = 0;
        int res = 0;
        if (len < 2)
            return 0;
        for (int i = 0; i < len - 1; i++) {
            temp = nums[i + 1] - nums[i];
            res = Math.max(res, temp);
        }
        return res;
    }
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值