• leetcode 330 按要求补齐数组


    package com.example.lettcode.dailyexercises;
    
    /**
     * @Class MinPatches
     * @Description 330 按要求补齐数组
     * 给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都
     * 可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。
     * <p>
     * 示例 1:
     * <p>
     * 输入: 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] 区间里所有的数。
     * 所以我们最少需要添加一个数字。
     * <p>
     * 示例 2:
     * <p>
     * 输入: nums = [1,5,10], n = 20
     * 输出: 2
     * 解释: 我们需要添加 [2, 4]。
     * <p>
     * <p>
     * 示例 3:
     * <p>
     * 输入: nums = [1,2,2], n = 5
     * 输出: 0
     * @Author
     * @Date 2020/12/29
     **/
    public class MinPatches {
        /**
         * 贪心算法
         *
         * @param nums
         * @param n
         * @return
         */
        public static int minPatches(int[] nums, int n) {
            int patchCount = 0;
            int index = 0;
            long miss = 1;
            while (miss <= n) {
                if (index < nums.length && nums[index] <= miss) {
                    // 当Miss能找到时,说明能直接覆盖到[1,miss+nums[index]-1)
                    miss += nums[index++];
                }
                else {
                    // 当找不到miss时,数组中添加miss,miss能找到说明能直接覆盖到[1,2*miss)
                    miss += miss;
                    patchCount++;
                }
            }
            return patchCount;
        }
    }
    
    //测试用例
    public static void main(String[] args) {
    	int[] nums = new int[]{1, 3};
    	int n = 6;
    	int ans = minPatches(nums, n);
    	System.out.println("MinPatches demo01 result:" + ans);
    
    	nums = new int[]{1, 5, 10};
    	n = 20;
    	ans = minPatches(nums, n);
    	System.out.println("MinPatches demo02 result:" + ans);
    
    	nums = new int[]{1, 2, 2};
    	n = 5;
    	ans = minPatches(nums, n);
    	System.out.println("MinPatches demo03 result:" + ans);
    
    	nums = new int[]{};
    	n = 8;
    	ans = minPatches(nums, n);
    	System.out.println("MinPatches demo04 result:" + ans);
    }
    
  • 相关阅读:
    BigDecimal.setScale 处理java小数点
    JS判断用户手机是IOS还是Android
    h5 移动端 监听软键盘弹起、收起
    【java】查重类的实现
    MySQL ORDER BY IF() 条件排序
    版本回退
    Log4j 配置某个类中某个方法的输出日志到指定文件
    简单地实现文章的查重
    simhash算法
    mysql中 for update 使用
  • 原文地址:https://www.cnblogs.com/fyusac/p/14208608.html
Copyright © 2020-2023  润新知