[leetcode]330. Patching Array

https://leetcode.com/problems/patching-array/

class Solution {
public:
    int minPatches(vector<int>& nums, int n) {
		sort(nums.begin(), nums.end());//nums由小到大排序
		long long int up = 0;//up表示当前所能表示数据的上界,即[1,up]
		int cnt = 0;//patch计数
 		for(long long int i = 1; i <= n; i++){//遍历,复杂度实际是O(log(n))
			while(nums.size() > 0 && nums[0] == i) {
				up += i;//nums内的数扩展当前上界
				nums.erase(nums.begin());
			}
			while(nums.size() > 0 && nums[0] <= up){
					up += nums[0];//扩展上界后,nums内的所有小于等于up的数都可以扩展up
					nums.erase(nums.begin());
			}
			if(i <= up) {
				i = up;//如果当前数在[1,up]则能被nums内的数表示
				continue;
			}
			cnt++;//如果当前数大于up,则cnt++相当于将当前数加入集合并扩展上界
			up+=i;
			i = up;//新加入的数扩展上界后,当前书到新上界(up)的所有数均能被表示,迭代量向前跳跃
			//所有的i=up使复杂度从O(n)下降到O(log(n))
		}
		return cnt;
    }
};


你可能感兴趣的:(LeetCode,C++,OJ)