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();
    	}
    }
    
  • 相关阅读:
    NET中的类型和装箱/拆箱原理
    转 C# 装箱和拆箱[整理]
    理解线程同步
    IsBackground的理解
    赛马会面试题
    FTP上传类
    FTPS加密上传
    转载WPF SDK研究 之 AppModel
    SQL Server查看错误日志存档编号及其详情
    Hive基础编程入门(一)
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/7510999.html
Copyright © 2011-2022 走看看