Discription
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums1 = 2 + 7 = 9,
return [0, 1].
思路
排列问题,思路有二:
基于分治
将原问题分解为一系列子问题:
记
Sn
为包含
n
个不同元素的集合。
- 在
Sn 中选取任意一个元素 ai 作为排列的第一个元素;- 对 Sn−ai 进行全排列,即为规模 O(n−1) 的子问题
- 将 ai 与 Sk−ai 的全排列组合;
时间复杂度: ?
空间复杂度:? 代码
class Solution { public: // 基于分治 void core(vector<int> &nums, int start, vector<vector<int>> &res) { // 边界条件 if (start == nums.size()) { res.push_back(nums); return; } for (int i = start; i < nums.size(); i++) { swap(nums[start], nums[i]); core(nums, start + 1, res); swap(nums[start], nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; core(nums, 0, res); return res; } };
基于深度优先搜索
时间复杂度: ?
空间复杂度:? 代码
class Solution { public: //基于dfs void dfs(vector<int> &nums, vector<bool> &visited, vector<int> &temp, vector<vector<int>> &res) { if (temp.size() == nums.size()) { res.push_back(temp); return; } for (int i = 0; i < nums.size(); i++) { if (visited[i] == false) { temp.push_back(nums[i]); visited[i] = true; dfs(nums, visited, temp, res); temp.pop_back(); visited[i] = false; } } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; vector<int> temp; vector<bool> visited(nums.size(), false); dfs(nums, visited, temp, res); return res; } };