zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    clientX和clientY属性需要注意的地方
    事件冒泡 --- 仿select下拉框
    body和document的梗
    完美运动框架
    仿flash运动框架
    多物体运动框架
    Computed Styles
    悬浮框
    【一起驴友】公司笔试
    Client Dimensions , offsetHeight , scrollTop 属性详解
  • 原文地址:https://www.cnblogs.com/fyusac/p/14208608.html
Copyright © 2011-2022 走看看