leetcode笔记:Patching Array

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

一. 题目描述

Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range[1, n]inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.

Example 1:
nums = [1, 3], n = 6
Return1.

二. 题目分析

题目的大意是,给定一个数组nums和一个数n,求添加最少的数使得区间[1, n]中的每个数都可以由数组nums中元素累加组成。

由于数组已经排序,因此基本的思路是,定义一个整形变量currSum,假设数组nums目前可以累加的数的范围为[1, currSum),如果此时向数组中添加一个元素k(k <= currSum)可以将累加的数的范围扩充为[1, currSum + k),而题目中要求向数组nums添加元素的次数最少,因此当且仅当k = currSum时,累加数的范围可以取到上限[1, 2 * currSum)。在遍历数组nums时,有以下两种操作:

  1. 当数组中有小于等于currSum的元素nums[index]时,则利用数组中的元素,同时currSum += nums[index];
  2. 若没有,则添加新元素currSum入数组,此时范围扩展至最大,同时令currSum <<= 1。

三. 示例代码

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int minPatches(vector<int>& nums, int n) {
        int result = 0, index = 0;
        // currSum标记了当前数组nums可累加到的最大范围[1, currSum)
        for (int currSum = 1; currSum <= n; )
        {
            // 数组内元素小于currSum时,可累加的sum上限增加为
            // currSum + nums[index],然后数组索引值加1
            if (index < nums.size() && nums[index] <= currSum)
                currSum += nums[index++];
            else
            {   
                currSum <<= 1; // 添入元素后,可累加的sum范围加倍
                ++result;
            }
        }
        return result;
    }
};

四. 小结

这种方法并不容易马上想到,对于这一类型的问题,特别需要在纸面上多列举例子,慢慢从中找出规律。

标签: 代码

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:php实现tail命令

下一篇:使用php对二维数组按数组值进行排序