zoukankan      html  css  js  c++  java
  • 77. Combinations(medium, backtrack, 重要, 弄了1小时)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

    For example,
    If n = 4 and k = 2, a solution is:

    [
     [2,4],
     [3,4],
     [2,3],
     [1,2],
     [1,3],
     [1,4],
    ]
    

    做了好几个这种题了,就是 backtrack problem, 1小时做出,但不容易,各种小毛病.
    我的程序蠢蠢的建立了一个 vector<int> A;. 其实,只玩弄变量n就行了.

    我犯的错误,如下:
    start + 1, start++ 和 ++start

    自己第一次写的代码是
    for (int i = start; i < A.size(); i++) {
    	temp.push_back(A[i]);
    
    	// 应把 start+1 改为 ++start, start 应该随 i 变化而变化
    	backtrack(res, temp, A, len, start + 1);
    	temp.pop_back();
    }
    
    e.g.
    n = 4, k = 2
    [1 2 3 4]
    结果应为:        [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
    我错误结果为:    [[1,2],[1,3],[1,4],[2,2],[2,3],[2,4],[3,2],[3,3],[3,4],[4,2],[4,3],[4,4]]
    

    自个想法,自个代码:

    vector<vector<int>> combine(int n, int k) {
    	vector < vector<int> > res;
    	vector<int> temp;
    	vector<int> A;
    	for (int i = 1; i <= n; i++)
    		A.push_back(i);
    
    	backtrack(res, temp, A, k, 0);
    	return res;
    }
    
    void backtrack(vector<vector<int> >& res, vector<int>& temp, vector<int>& A,
    		const int len, int start) {
    	if (temp.size() == len) {
    		res.push_back(temp);
    		return;
    	}
    
    	for (int i = start; i < A.size(); i++) {
    		temp.push_back(A[i]);
    		// start++;
    		// 下面血淋淋地体现了
    		// start + 1, start++ 和 ++start 的巨大不同了
    		backtrack(res, temp, A, len, ++start);
    		temp.pop_back();
    	}
    }
    
  • 相关阅读:
    Django 基础教程
    Python之路【第十七篇】:Django【进阶篇 】
    Python之路【第十六篇】:Django【基础篇】
    Python之路【第十五篇】:Web框架
    AngularJS 教程
    jQuery
    最小公倍数生成树
    51nod 1743 雪之国度
    codeforces 633F The Chocolate Spree
    hihocoder 1246 王胖浩与环
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/7510999.html
Copyright © 2011-2022 走看看