移动端响应式网站怎么做移动端适配 wordpress
移动端响应式网站怎么做,移动端适配 wordpress,鑫三科技网站设计,网页制作平台软件目录
* 491.递增子序列
#x1f4a1;解题思路
回溯三部曲
#x1f4bb;实现代码
* 46.全排列
#x1f4a1;解题思路
# 回溯三部曲
单层搜索的逻辑
#x1f4bb;实现代码
* 47.全排列 II
#x1f4a1;解题思路
#x1f4bb;实现代码 * 491.递增子序列
题目链…目录
* 491.递增子序列
解题思路
回溯三部曲
实现代码
* 46.全排列
解题思路
# 回溯三部曲
单层搜索的逻辑
实现代码
* 47.全排列 II
解题思路
实现代码 * 491.递增子序列
题目链接 491.递增子序列
给定一个整型数组, 你的任务是找到所有该数组的递增子序列递增子序列的长度至少是2。
示例:
输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
说明:
给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字相等的数字应该被视为递增的一种情况。
解题思路 回溯三部曲
递归函数参数
本题求子序列很明显一个元素不能重复使用所以需要startIndex调整下一层递归的起始位置。
代码如下
vectorvectorint result;
vectorint path;
void backtracking(vectorint nums, int startIndex)终止条件
本题其实类似求子集问题也是要遍历树形结构找每一个节点
可以不加终止条件startIndex每次都会加1并不会无限递归。
但本题收集结果有所不同题目要求递增子序列大小至少为2所以代码如下
if (path.size() 1) {result.push_back(path);// 注意这里不要加return因为要取树上的所有节点
}单层搜索逻辑 在图中可以看出同一父节点下的同层上使用过的元素就不能再使用了
那么单层搜索代码如下
unordered_setint uset; // 使用set来对本层元素进行去重
for (int i startIndex; i nums.size(); i) {if ((!path.empty() nums[i] path.back())|| uset.find(nums[i]) ! uset.end()) {continue;}uset.insert(nums[i]); // 记录这个元素在本层用过了本层后面不能再用了path.push_back(nums[i]);backtracking(nums, i 1);path.pop_back();
}对于已经习惯写回溯的同学看到递归函数上面的uset.insert(nums[i]);下面却没有对应的pop之类的操作应该很不习惯吧
这也是需要注意的点unordered_setint uset; 是记录本层元素是否重复使用新的一层uset都会重新定义清空所以要知道uset只负责本层
实现代码
class Solution {ListListInteger result new ArrayList();ListInteger path new ArrayList();public ListListInteger findSubsequences(int[] nums) {backTracking(nums, 0);return result;}private void backTracking(int[] nums, int startIndex){if(path.size() 2)result.add(new ArrayList(path)); HashSetInteger hs new HashSet();for(int i startIndex; i nums.length; i){if(!path.isEmpty() path.get(path.size() -1 ) nums[i] || hs.contains(nums[i]))continue;hs.add(nums[i]);path.add(nums[i]);backTracking(nums, i 1);path.remove(path.size() - 1);}}
}class Solution {private ListInteger path new ArrayList();private ListListInteger res new ArrayList();public ListListInteger findSubsequences(int[] nums) {backtracking(nums,0);return res;}private void backtracking (int[] nums, int start) {if (path.size() 1) {res.add(new ArrayList(path));}int[] used new int[201];for (int i start; i nums.length; i) {if (!path.isEmpty() nums[i] path.get(path.size() - 1) ||(used[nums[i] 100] 1)) continue;used[nums[i] 100] 1;path.add(nums[i]);backtracking(nums, i 1);path.remove(path.size() - 1);}}
}//法二使用map
class Solution {//结果集合ListListInteger res new ArrayList();//路径集合LinkedListInteger path new LinkedList();public ListListInteger findSubsequences(int[] nums) {getSubsequences(nums,0);return res;}private void getSubsequences( int[] nums, int start ) {if(path.size()1 ){res.add( new ArrayList(path) );// 注意这里不要加return要取树上的节点}HashMapInteger,Integer map new HashMap();for(int istart ;i nums.length ;i){if(!path.isEmpty() nums[i] path.getLast()){continue;}// 使用过了当前数字if ( map.getOrDefault( nums[i],0 ) 1 ){continue;}map.put(nums[i],map.getOrDefault( nums[i],0 )1);path.add( nums[i] );getSubsequences( nums,i1 );path.removeLast();}}
}* 46.全排列
题目链接46.全排列
给定一个 没有重复 数字的序列返回其所有可能的全排列。
示例:
输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]
解题思路 # 回溯三部曲
递归函数参数
首先排列是有序的也就是说 [1,2] 和 [2,1] 是两个集合这和之前分析的子集以及组合所不同的地方。
可以看出元素1在[1,2]中已经使用过了但是在[2,1]中还要在使用一次1所以处理排列问题就不用使用startIndex了。
但排列问题需要一个used数组标记已经选择的元素如图橘黄色部分所示: 代码如下
vectorvectorint result;
vectorint path;
void backtracking (vectorint nums, vectorbool used)递归终止条件 可以看出叶子节点就是收割结果的地方。
当收集元素的数组path的大小达到和nums数组一样大的时候说明找到了一个全排列也表示到达了叶子节点。
代码如下
// 此时说明找到了一组
if (path.size() nums.size()) {result.push_back(path);return;
}单层搜索的逻辑
因为排列问题每次都要从头开始搜索例如元素1在[1,2]中已经使用过了但是在[2,1]中还要再使用一次1。
而used数组其实就是记录此时path里都有哪些元素使用了一个排列里一个元素只能使用一次。
代码如下
for (int i 0; i nums.size(); i) {if (used[i] true) continue; // path里已经收录的元素直接跳过used[i] true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] false;
}实现代码
class Solution {ListListInteger result new ArrayList();// 存放符合条件结果的集合LinkedListInteger path new LinkedList();// 用来存放符合条件结果boolean[] used;public ListListInteger permute(int[] nums) {if (nums.length 0){return result;}used new boolean[nums.length];permuteHelper(nums);return result;}private void permuteHelper(int[] nums){if (path.size() nums.length){result.add(new ArrayList(path));return;}for (int i 0; i nums.length; i){if (used[i]){continue;}used[i] true;path.add(nums[i]);permuteHelper(nums);path.removeLast();used[i] false;}}
}// 解法2通过判断path中是否存在数字排除已经选择的数字
class Solution {ListListInteger result new ArrayList();LinkedListInteger path new LinkedList();public ListListInteger permute(int[] nums) {if (nums.length 0) return result;backtrack(nums, path);return result;}public void backtrack(int[] nums, LinkedListInteger path) {if (path.size() nums.length) {result.add(new ArrayList(path));}for (int i 0; i nums.length; i) {// 如果path中已有则跳过if (path.contains(nums[i])) {continue;} path.add(nums[i]);backtrack(nums, path);path.removeLast();}}
}* 47.全排列 II
题目链接47.全排列 II
给定一个可包含重复数字的序列 nums 按任意顺序 返回所有不重复的全排列。
示例 1
输入nums [1,1,2]输出 [[1,1,2], [1,2,1], [2,1,1]]
示例 2
输入nums [1,2,3]输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示
1 nums.length 8-10 nums[i] 10
解题思路
去重一定要对元素进行排序这样我们才方便通过相邻的节点来判断是否重复使用了。 图中我们对同一树层前一位也就是nums[i-1]如果使用过那么就进行去重。
一般来说组合问题和排列问题是在树形结构的叶子节点上收集结果而子集问题就是取树上所有节点的结果。
实现代码
class Solution {//存放结果ListListInteger result new ArrayList();//暂存结果ListInteger path new ArrayList();public ListListInteger permuteUnique(int[] nums) {boolean[] used new boolean[nums.length];Arrays.fill(used, false);Arrays.sort(nums);backTrack(nums, used);return result;}private void backTrack(int[] nums, boolean[] used) {if (path.size() nums.length) {result.add(new ArrayList(path));return;}for (int i 0; i nums.length; i) {// used[i - 1] true说明同⼀树⽀nums[i - 1]使⽤过// used[i - 1] false说明同⼀树层nums[i - 1]使⽤过// 如果同⼀树层nums[i - 1]使⽤过则直接跳过if (i 0 nums[i] nums[i - 1] used[i - 1] false) {continue;}//如果同⼀树⽀nums[i]没使⽤过开始处理if (used[i] false) {used[i] true;//标记同⼀树⽀nums[i]使⽤过防止同一树枝重复使用path.add(nums[i]);backTrack(nums, used);path.remove(path.size() - 1);//回溯说明同⼀树层nums[i]使⽤过防止下一树层重复used[i] false;//回溯}}}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/88761.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!