文章目录

  • 1.预备知识
    • 1.1 递归
    • 1.2 回溯
    • 1.3 位运算
  • 2.子集
    • 2.1 题目描述
    • 2.2 解题思路——回溯递归法
    • 2.3 C++实现
    • 2.4 解题思路——位运算法
    • 2.5 位运算实现
  • 3.子集 II
    • 3.1 题目描述
    • 3.2 解题思路
    • 3.3 回溯递归法——C++实现
    • 3.4 位运算——C++实现
  • 4.组合总和 II
    • 4.1 题目描述
    • 4.2 解题思路
    • 4.3 C++实现
  • 5.括号生成
    • 5.1 题目描述
    • 5.2 解题思路
    • 5.3 C++实现
  • 6.N 皇后
    • 6.1 题目描述
    • 6.2 棋盘和皇后表示
    • 6.3 回溯算法
    • 6.4 C++实现
  • 7.
    • 7.1 预备知识
    • 7.2 题目描述
    • 7.3 C++实现

1.预备知识

1.1 递归

1.2 回溯

1.3 位运算

2.子集

2.1 题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集

2.2 解题思路——回溯递归法

2.3 C++实现
class Solution {public:vector<vector<int>> subsets(vector<int>& nums) {vector<int> item;vector<vector<int>> result;result.push_back(item);generate(0,nums,item,result);return result;}
private:void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int>>& result){if(i>=nums.size()){return;}item.push_back(nums[i]);result.push_back(item);generate(i+1,nums,item,result);item.pop_back();generate(i+1,nums,item,result);}
};
2.4 解题思路——位运算法

2.5 位运算实现
class Solution {public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> result;//int all_set=pow(2,nums.size());int all_set=1<<nums.size();for(int i=0;i<all_set;i++){vector<int> item;for(int j=0;j<nums.size();j++){if(i&(1<<j)){item.push_back(nums[j]);}}result.push_back(item);}return result;}};

3.子集 II

3.1 题目描述

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

3.2 解题思路


3.3 回溯递归法——C++实现
class Solution {public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int> item;vector<vector<int>> result;set<vector<int>> res_set;sort(nums.begin(),nums.end());result.push_back(item);generate(0,nums,item,result,res_set);return result;}
private:void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int>>& result,set<vector<int>>& res_set){if(i>=nums.size()){return;}item.push_back(nums[i]);if(res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);}generate(i+1,nums,item,result,res_set);item.pop_back();generate(i+1,nums,item,result,res_set);}
};
3.4 位运算——C++实现
class Solution {public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {int all_set;vector<vector<int>> result;set<vector<int>> res_set;sort(nums.begin(),nums.end());all_set=1<<nums.size();for(int i=0;i<all_set;i++){vector<int> item;for(int j=0;j<nums.size();j++){if(i&(1<<j)){item.push_back(nums[j]);}}if(res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);                    }}return result;}
};

4.组合总和 II

4.1 题目描述

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

4.2 解题思路

4.3 C++实现
class Solution {public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<int> item;vector<vector<int>> result;set<vector<int>> res_set;sort(candidates.begin(),candidates.end());generate(0,candidates,item,result,res_set,0,target);return result;}
private:void generate(int i,vector<int>& candidates,vector<int>& item,vector<vector<int>>& result,set<vector<int>>& res_set,int sum,                          int target){if(i>=candidates.size()||sum>target){return;}sum+=candidates[i];item.push_back(candidates[i]);if(sum==target&&res_set.find(item)==res_set.end()){result.push_back(item);res_set.insert(item);}generate(i+1,candidates,item,result,res_set,sum,target);sum-=candidates[i];item.pop_back();generate(i+1,candidates,item,result,res_set,sum,target);}
};

5.括号生成

5.1 题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

5.2 解题思路

输出所有组合

5.3 C++实现
class Solution {public:vector<string> generateParenthesis(int n) {vector<string> result;generate("",n,n,result);return result;}
private:void generate(string item,int left,int right,vector<string>& result){if(left==0&&right==0){result.push_back(item);return;}if(left>0){generate(item+'(',left-1,right,result);}if(left<right){generate(item+')',left,right-1,result);}}
};

6.N 皇后

6.1 题目描述

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

6.2 棋盘和皇后表示


6.3 回溯算法


6.4 C++实现
class Solution {public:vector<vector<string>> solveNQueens(int n) {vector<vector<string>> result;vector<vector<int>> mark;vector<string> location;for(int i=0;i<n;i++){mark.push_back((vector<int>()));for(int j=0;j<n;j++){mark[i].push_back(0);}location.push_back("");location[i].append(n,'.');}generate(0,n,location,result,mark);return result;}
private:void put_down_the_queen(int x,int y,vector<vector<int>>&mark){static const int dx[]={-1,1,0,0,-1,-1,1,1};static const int dy[]={0,0,-1,1,-1,1,-1,1};mark[x][y]=1;int new_x,new_y;for(int i=1;i<mark.size();i++){for(int j=0;j<8;j++){new_x=x+i*dx[j];new_y=y+i*dy[j];if(new_x>=0&&new_x<mark.size()&&new_y>=0&&new_y<mark.size()){mark[new_x][new_y]=1;}}}}void generate(int k,int n,vector<string> &location,vector<vector<string>> &result,vector<vector<int>> &mark){if(k==n){result.push_back(location);return;}for(int i=0;i<n;i++){if(mark[k][i]==0){vector<vector<int>> tmp_mark=mark;location[k][i]='Q';put_down_the_queen(k,i,mark);generate(k+1,n,location,result,mark);mark=tmp_mark;location[k][i]='.';}}}
};

7.

7.1 预备知识

#include<vector>void merge_sort_two_vec(vector<int> &sub_vec1,vector<int> &sub_vec2,vector<int> &vec){int i=0,j=0;while(i<sub_vec1.size()&&j<sub_vec2.size()){if(sub_vec1[i]<=sub_vec2[j]){vec.push_back(sub_vec1[i]);i++;}   else{vec.push_back(sub_vec2[j]);j++;}   }   for(;i<sub_vec1.size();i++){vec.push_back(sub_vec1[i]);}   for(;j<sub_vec2.size();j++){vec.push_back(sub_vec2[j]);}   }

7.2 题目描述

给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。

输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

7.3 C++实现

代码实现

数据结构与算法——递归、回溯与分治相关推荐

  1. 数据结构与算法 - 递归回溯(迷宫问题)

    递归的概念 简单说就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码简介 递归的调用机制 递归能解决什么问题 递归需要遵守的重要规则 下面用代码来实现一个迷 ...

  2. Java 数据结构和算法 - 递归

    Java 数据结构和算法 - 递归 什么是递归 背景:数学归纳法证明 基本递归 printing numbers in any base 它为什么有效 如何工作 递归太多是危险的 树 数值应用 模幂运 ...

  3. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,--中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

  4. 数据结构与算法_03_分而治之的分治算法

    数据结构与算法,系列文章传送地址,请点击本链接. 目录 一.如何理解分治算法 二.分治算法需要满足的条件 三.分治算法--代码模板 四.案例 五.分治思想在海量数据处理中的应用 一.如何理解分治算法 ...

  5. 数据结构与算法——递归、回溯与分治汇总整理

    目录 预备知识:递归函数与回溯算法 例1-a:求子集(medium)(回溯法.位运算法) 例1-b:求子集2(medium)(回溯法) 例1-c:组合数之和2(medium)(回溯法.剪枝) 例2:生 ...

  6. python【数据结构与算法】计数问题(分治)

    文章目录 1 算法描述 2 实现 3 复杂度 1 算法描述 题目:给定n个整数的数组A以及一个数x,设计一个分治算法,求出x在数组中出现的次数,并分析时间复杂度. 算法思想: 分:先将问题划分为大小近 ...

  7. 数据结构与算法--递归(Recursion Algorithm)

    什么是递归算法? 把规模大的.较难解决的问题变成规模较小的.易解决的同一问题.规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解(基本问题),从而得到原来问题的解. 哪时候用递归算 ...

  8. 数据结构与算法--递归(factorial)

    什么是递归? 百度百科上的解释是:程序调用自身的编程技巧称为递归(factorial). 递归是一种应用比较广泛的算法,它通常把一个复杂的问题转化为一个与原问题相似小问题来求解,这样大大的减少了程序的 ...

  9. Java学习手册:(数据结构与算法-递归)一个人爬楼梯,可以一次爬一阶或者两阶,问n层楼梯有多少种爬法?

    算法思想: (1)只有一层楼梯,有1种方法,即 f(1) = 1; (2)有两层楼梯,有2种方法,即 f(2) = 2: (3)有三层楼梯,a.如果第一步爬一层,后面还有两层楼梯未爬,有2种方法,即f ...

最新文章

  1. MPLS 具有哪些特点?——Vecloud
  2. java udp 多播 广播_Java UDP 广播与多播
  3. 【Vegas原创】终端服务器超出了最大允许连接数 解决方法
  4. 图片处理 javax.imageio.IIOException: Unsupported Image Type
  5. android 过滤数组中的重复元素,Flutter List数组避免插入重复数据的实现
  6. mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)
  7. 遍历字典_Python编程从入门到实践-连载5(字 典)
  8. leetcode 1.两数之和 (two sum)
  9. 全志V3s IIC控制器驱动分析
  10. Android jetpack DataStore 1.0.0-rc02最新版从SharedPreferences迁移到Preferences DataStore
  11. C#使用WebProxy实现代理访问webservice
  12. MOS管在开关电路中的使用
  13. PyCharm谷歌翻译插件Translation提示:更新 TKK 失败,请检查网络连接
  14. MATLAB——复数运算
  15. 远程桌面 CredSSP加密Oracle修正 解决方法
  16. 【爬虫】每天定时爬取网页小故事并发送至指定邮箱
  17. Flink任务链Operator Chains
  18. python 导入离线地图_Geo地图导入python数据分析--(重点推荐)
  19. 基于BQ76PL455的BMS电路板设计
  20. python-OpenCV图像处理常用函数汇总(三)

热门文章

  1. LeetCode 835. 图像重叠
  2. Pandas入门2(DataFunctions+Maps+groupby+sort_values)
  3. LeetCode 66. 加一
  4. LeetCode 1233. 删除子文件夹
  5. LeetCode 667. 优美的排列 II(找规律)
  6. 超级签名源码_企业签名和超级签名有哪些区别?
  7. Matplotlib - 饼图、环形图 pie() 多重饼图 subplots() 所有用法详解
  8. java从控制台输入数组_Java将控制台输入的一行整数转成整型数组
  9. 互联网(IT)大厂面试技巧(面经)
  10. java架构师进阶独孤九剑系列(一):数据结构与算法