【算法与数据结构】46、47、LeetCode全排列I, II

文章目录

  • 一、46.全排列I
  • 二、47.全排列II
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、46.全排列I

在这里插入图片描述

  思路分析:本题要求是全排列,意味着每次递归的时候startIndex都要从0开始,否则只会得到一个[1 2 3]的组合。从零开始还需要筛选掉重复的组合,引入一个used数组,使用过的元素赋值为1,跳过该循环。因为是全排列,终止条件就是单个组合中元素个数等于nums数组大小。
  程序如下

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {if (path.size() == nums.size()) {	// 终止条件result.push_back(path);return;}for (int i = startIndex; i < nums.size(); i++) {if (used[i]) continue;path.push_back(nums[i]);	// 处理节点	used[i] = true;backtracking(nums, 0, used);	// 递归used[i] = false;path.pop_back();			// 回溯}}
public:vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(), 0);backtracking(nums, 0, used);return result;}
};

复杂度分析:

  • 时间复杂度: O ( n ! ) O(n!) O(n!)
  • 空间复杂度: O ( n ) O(n) O(n)

二、47.全排列II

在这里插入图片描述

  思路分析:在上一题的基础之上本题中的nums元素可以是重复的,因此需要进一步去重,首先题目对全排列组合的顺序没有要求,可以对nums数组进行排序操作。i>0的条件是对nums[i-1]的限制,表示数组的索引不能小于0。nums[i]等于nums[i-1]时就是出现了重复元素,当重复元素首次在nums(排序后的)中出现时(例如[1 1 2]中的第一个1),组合不会有重复的,再次出现时(第二个1),会出现重复组合,此时的used[i-1] = 0。这道题used[i-1]=0或者used[i-1]=1都能够去重,但是used[i-1]=0的去重效率更高
  程序如下

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {if (path.size() == nums.size()) {	// 终止条件result.push_back(path);return;}for (int i = startIndex; i < nums.size(); i++) {if (i > 0 && nums[i] == nums[i-1] && used[i-1] == 0 || used[i]) continue;path.push_back(nums[i]);	// 处理节点	used[i] = true;backtracking(nums, 0, used);	// 递归used[i] = false;path.pop_back();			// 回溯}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(), 0);sort(nums.begin(), nums.end());backtracking(nums, 0, used);return result;}
};

复杂度分析:

  • 时间复杂度: O ( n ! ∗ n ) O(n!*n) O(n!n)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

// 46全排列I
# include <iostream>
# include <string>
# include <vector>
using namespace std;class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {if (path.size() == nums.size()) {	// 终止条件result.push_back(path);return;}for (int i = startIndex; i < nums.size(); i++) {if (used[i]) continue;path.push_back(nums[i]);	// 处理节点	used[i] = true;backtracking(nums, 0, used);	// 递归used[i] = false;path.pop_back();			// 回溯}}
public:vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(), 0);backtracking(nums, 0, used);return result;}
};int main() {Solution s1;vector<int> nums = { 1, 2, 3 };vector<vector<int>> result = s1.permute(nums);for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {cout << *jt << " ";}cout << endl;}system("pause");return 0;
}
// 47全排列II
# include <iostream>
# include <string>
# include <vector>
# include <algorithm>
using namespace std;class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(const vector<int>& nums, int startIndex, vector<bool>& used) {if (path.size() == nums.size()) {	// 终止条件result.push_back(path);return;}for (int i = startIndex; i < nums.size(); i++) {if (i > 0 && nums[i] == nums[i-1] && used[i-1] == 0 || used[i]) continue;path.push_back(nums[i]);	// 处理节点	used[i] = true;backtracking(nums, 0, used);	// 递归used[i] = false;path.pop_back();			// 回溯}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(), 0);sort(nums.begin(), nums.end());backtracking(nums, 0, used);return result;}
};int main() {Solution s1;vector<int> nums = { 1, 1, 2 };vector<vector<int>> result = s1.permuteUnique(nums);for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++) {for (vector<int>::iterator jt = (*it).begin(); jt != (*it).end(); jt++) {cout << *jt << " ";}cout << endl;}system("pause");return 0;
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177496.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电源电压范 围宽、功耗小、抗干扰能力强的国产芯片GS069适用于电动工具等产品中,采用SOP8的封装形式封装

GS069电动工具直流调速电路是CMOS专用集成电路&#xff0c;具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络&#xff0c;改变与之相接 的VMOS 管的输出&#xff0c;达到控制电动工具转速的作用。该电路输出幅值宽&#xff0c; 频率变化小&#xff0c;占空比…

环保气膜建筑的运维成本在哪几个方面

作为一种环保建筑&#xff0c;气膜结构在工业和文体领域得到了广泛认可。尽管气膜建筑在经济上具有明显的优势&#xff0c;但对于不了解它的人来说&#xff0c;他们可能会下意识地认为在运营和维护过程中会产生大量费用。今天&#xff0c;让我们一起了解一下气膜建筑在运营维护…

远程创建分支本地VScode看不到分支

在代码存放处右击&#xff0c;点击Git Bash Here 输入git fetch–从远程仓库中获取最新的分支代码和提交历史 就OK啦&#xff0c;现在分支可以正常查看了

硬件开发笔记(十一):Altium Designer软件介绍、安装过程和打开pcb工程测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134405411 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库&#xff0c;它可以模拟浏览器的行为&#xff0c;实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子&#xff0c;它可以爬取百度搜索结果页面的标题和链接&#xff1a; import mechanize from bs4 import …

虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案

来源&#xff1a;雅名特自动驾驶 虹科方案 | 从概念到生产的自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案 自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案 自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案能够研究和验证高历程实验和恶劣驾…

『数据结构与算法』散列表(哈希表)

1. 什么是散列表 散列表&#xff08;Hash Table&#xff09;也叫哈希表&#xff0c;是根据给定关键字&#xff08;Key&#xff09;来计算出该关键字在表中存储地址的数据结构。也就是说&#xff0c;散列表建立了关键字与存储地址之间的一种直接映射关系&#xff0c;将关键字映…

linux系统下如何获取文件的创建时间

1. ll 或 ls -l config.json 查看时间 2. 使用stat 查看创建时间 access time&#xff1a;表示我们最后一次访问&#xff08;仅仅是访问&#xff0c;没有改动&#xff09;文件的时间 modify time&#xff1a;表示我们最后一次修改文件的时间 change time&#xff1a;表示我们最…

excel中用NORM.INV函数计算正态累积分布的逆

NORM.INV函数返回正态累积分布的逆。它的形式为NORM.INV(probability,mean,standard_dev)。 正态累积分布函数和正态概率密度函数互为逆。 参数说明&#xff1a; probability&#xff1a;对应正态分布的累积分布值。例如该值等于0.9&#xff0c;表示累积概率之和是0.9Mean&am…

韦东山老师的从0写RTOS笔记

生产bin文件 fromelf --bin --outputled.bin Objects\led_c.axf 生产汇编文件 fromelf --text -a -c --outputled.dis Objects\led_c.axf 1.AAPCS函数调用规则 R0-R3&#xff1a;传递参数R0&#xff1a;传递返回值SP&#xff08;R13&#xff09;&#xff1a;栈指针LR&#xff…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明&#xff1a;Edge自动更新版本后&#xff08;版本 119.0.2151.58&#xff09;&#xff0c;出现了侧边栏&#xff0c;看着很不舒服&#xff0c;效果如上图 修改&#xff1a; 1、在设置找到侧栏 2、点击Copilot后&#xff0c;展示的页面中会有始终显示边栏这一开…

雷达测角原理、测角精度、测角分辨率以及3DFFT角度估计算法汇总

1.角度测量方法 依据&#xff1a;电磁波的直线传播和雷达天线的方向性。 分类&#xff1a;振幅法测角、相位法测角 1.1 相位法测角 相位法测角利用多个天线所接收回波信号之间的相位差进行测角。如下图所示&#xff1b; 图 1 设在θ方向有一远区目标&#xff0c;则到达接收点…