zoukankan      html  css  js  c++  java
  • Combination Sum 和Combination Sum II

    这两道题的基本思路和combination那一题是一致的,也是分治的方法。

    其中combination Sum复杂一点,因为每个数可能用多次。仔细分析下,本质上也是一样的。原来是每个数仅两种可能。现在每个数有k +1中可能,k = target / i。

    所以就是把简单的if else 分支变成for循环:

    vector<vector<int> > combHelper(vector<int>::iterator first,
    						vector<int>::iterator last, int target){
    	vector<vector<int>> result;
    	if (target <= 0 || last == first) return result;
    	if (*(last - 1) == target){
    		vector<int> vi;
    		vi.push_back(target);
    		result.push_back(vi);
    		auto r2 = combHelper(first, last - 1, target);
    		for (auto it = r2.begin(); it != r2.end(); it++)
    			result.push_back(*it);
    	}
    	else if (*(last - 1) < target){
    		auto r1 = combHelper(first, last - 1, target - *(last - 1));
    		for (auto it = r1.begin(); it != r1.end(); it++){
    			it->push_back(*(last - 1));
    			result.push_back(*it);
    		}
    		auto r2 = combHelper(first, last - 1, target);
    		for (auto it = r2.begin(); it != r2.end(); it++)
    			result.push_back(*it);
    	}
    	else {
    		auto r2 = combHelper(first, last - 1, target);
    		for (auto it = r2.begin(); it != r2.end(); it++)
    			result.push_back(*it);
    	}
    	return result;
    }
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
    	sort(num.begin(), num.end());
    	auto result = combHelper(num.begin(), num.end(), target);
    	if (!result.empty()){
    		sort(result.begin(), result.end());
    		auto it = unique(result.begin(), result.end());
    		result.erase(it, result.end());
    	}
    	return result;
    }
    

      

  • 相关阅读:
    路由器实验之配置实验、直连路由验证、静态路由
    RIP路由选择实验
    多线程编程核心技术(十五)CountDownLatch和CyclicBarrier
    maven新建项目时的Run配置
    archetypeCatalog=internal
    Archetype插件的介绍和使用
    maven POM中的source和target编译参数是什么意思
    什么是IOC?
    什么是POJO?
    @SpringBootConfiguration注解
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/3967332.html
Copyright © 2011-2022 走看看