bool NextPermutation(Array1D &array) { Array1D::size_type size = array.size(); if (size <= 1) { return false; } for (int i = size - 2, ii = size - 1; i >= 0; i--, ii--) { if (array[i] < array[ii]) { int j = size - 1; while (array[j] <= array[i]) { j--; } std::swap(array[i], array[j]); std::reverse(array.begin() + ii, array.end()); return true; } } std::reverse(array.begin(), array.end()); return false; }
Array2D CombinationWithDuplicatedElementsByNonRecursion(Array1D array, int K) { Array2D result; if (array.empty() || K <= 0) { return result; } if (array.size() < K) { result.push_back(array); /** @warning maybe exclude it */ return result; } std::sort(array.begin(), array.end()); result.push_back(Array1D()); int last = array[0], opt_result_num = 1; for (int i = 0; i < array.size(); i++) { if (array[i] != last) { last = array[i]; opt_result_num = result.size(); } Array2D::size_type result_size = result.size(); for (int j = result_size - 1; j >= result_size - opt_result_num; j--) { result.push_back(result[j]); result.back().push_back(array[i]); } } return result; }