推广

剑指offer 39- 数字排列

iseeyu2年前 (2024-02-21)推广109

图片来源于网络

时间复杂度分析:

搜索树中最后一层共 个叶节点,在叶节点处记录方案的计算量是 ,所以叶节点处的计算量是
搜索树一共有
个内部节点,在每个内部节点内均会for循环 n 次,因此内部节点的计算量也是 。 所以总时间复杂度是

class Solution {
public:
    vector<vector<int>> res;//结果数组
    vector<bool> st;//状态数组
    vector<int> path;//保存当前路径的数
    vector<vector<int>> permutation(vector<int>& nums) {
        for(int i=0; i<nums.size(); i++) st.push_back(false);
        dfs(nums, 0);
        return res;
    }
    
    void dfs(vector<int>& nums, int u) {
        if (u == nums.size()) {//u==nums.size()说明当前路径结束,返回一种情况
            res.push_back(path);
            return;
        }
        
        for(int i=0; i<nums.size(); i++) {
            if(!st[i]) {
                st[i] = true;
                path.push_back(nums[i]);
                dfs(nums, u+1);
                //从每个分支退回来的时候需要把修改过的状态还原
                st[i] = false; 
                path.pop_back();
            }
        }
    }
};

再看一题可能包含重复数字的

输入一组数字(可能包含重复数字),输出其所有的排列方式。
样例

输入:[1,2,3]

输出:
      [
        [1,2,3],
        [1,3,2],
        [2,1,3],
        [2,3,1],
        [3,1,2],
        [3,2,1]
      ]

分析:
由于有重复元素的存在,这道题的枚举顺序和上次不同。

先将所有数从小到大排序,这样相同的数会排在一起;
从左到右依次枚举每个数,每次将它放在一个空位上;
对于相同数,我们人为定序,就可以避免重复计算:我们在dfs时记录一个额外的状态,记录上一个相同数存放的位置 start,我们在枚举当前数时,只枚举 start+1,start+2,…,n这些位置。
不要忘记递归前和回溯时,对状态进行更新。

时间复杂度:
搜索树中最后一层共 个节点,前面所有层加一块的节点数量相比于最后一层节点数是无穷小量,可以忽略。且最后一层节点记录方案的计算量是 ,所以总时间复杂度是

class Solution {
public:
    vector<vector<int>> res;
    vector<int> st, path;
    vector<vector<int>> permutation(vector<int>& nums) {
        st = vector<int>(nums.size(), false);
        sort(nums.begin(), nums.end());
        path = vector<int>(nums.size());
        dfs(nums, 0, 0);
        return res;
    }
    
    void dfs(vector<int>& nums, int u, int start) {
        if(u == nums.size()) {
            res.push_back(path);
            return;
        }
        if(!u || nums[u] != nums[u-1]) start = 0;
        for(int i=start;i<nums.size();i++) {
            if (!st[i]) {
                st[i] = true;
                path[i] = nums[u];
                dfs(nums, u+1, i+1);
                // 用st[i]表示path[i]是否存在
                // st[i] == false,表示path[i]存在;
                // st[i] == true,表示path[i]不存在;
                // 当st[i] == false时,path[i]下次会被新的值覆盖掉,所以就不需要再remove了。
                st[i] = false;
            }
        }
    }
};

另一种解法:

class Solution {
public:
    vector<vector<int>> res;
    // vector<int> st;
    vector<int> path;
    vector<vector<int>> permutation(vector<int>& nums) {
        // st = vector<int>(nums.size(), false);
        sort(nums.begin(), nums.end());
        // path = vector<int>(nums.size());
        path.resize(nums.size());
        dfs(nums, 0, 0, 0);
        return res;
    }
    
    void dfs(vector<int>& nums, int u, int start, int state) {
        if(u == nums.size()) {
            res.push_back(path);
            return;
        }
        if(!u|| nums[u] != nums[u-1]) start = 0;
        
        for(int i=start;i<nums.size();i++) {
            if(!(state>>i&1)) {
                path[i] = nums[u];
                dfs(nums, u+1, i+1, state+(1<<i));
            }
        }
    }
};

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57662.html

相关文章

顶级商业思维(一)——PESTEL

顶级商业思维(一)——PESTEL

顶级商业 根据《Business Analysis Techniques: 99 essential tools for success 》一书所述,调查一个企业面临的全球商业环境常用的外部环境分析方法有如下四种分别是PEST、PESTLIED、PESTEL和PESTEL。...

小编教你网络推广企业应该注意什么(网络推广对企业有什么好处)

小编教你网络推广企业应该注意什么(网络推广对企业有什么好处)

是指以产品或服务为核心内容,建立网站,再把这个网站通过各种免费或收费渠道展示给网民的一种推广方式。网络推广是中小型企业网络营销的重要手段,不仅能够帮助企业品牌实现口碑营销,还能确立企业产品在公众当中的可信地位,提升品牌形象的同时,吸引更多的合作者和消费者。所以,在新时代的大背景下做好网络推广可以起到...

淘宝宝贝团营销购买有用吗

淘宝宝贝团营销购买有用吗

而挑选的越是好的商品,越容易促进销量,另外,关注/收藏店铺也会对小店的搜索权重有帮助,会提升您店铺商品的搜索排名呢。...

seo站内优化怎么做。

seo站内优化怎么做。

相信大家也很清楚啊,seo优化都是分为站内和站外的,如果说我们站内没有做好这样的一个基础没有的话,站内如何推广都是不可能吸引到更多的流量,即便是有流量,可能后续也都是不会在进入到我们网站中的。所以说站内的优化是必须要做好的,而且一定要逐步的完善,但是很多站长都是自己来做相应的优化工作,对seo站内优...

我来教你开发一个网站一般需要多长时间。

我来教你开发一个网站一般需要多长时间。

互联网时代,已经成为各企业必不可少的推广渠道,渐渐地也成为了企业的门面,企业网站质量的好坏一方面影响着推广效果,另一方面也决定着消费者对企业的第一印象,因此找一家专业的网站设计开发公司是非常重要的,对于企业来说,每一个项目都需要预估完成时间来保证后续工作的顺利进行,那设计开发一个网站大概呢?...

SEO关键词分为哪几类。

SEO关键词分为哪几类。

SEO关键词分为哪几类?按照搜索目的的不同,关键词大致可以分为三种类型:导航类、交易类、信息类。 关键词如何分类 导航类关键词,指的是用户在寻找特定网站,他知道自己想去的网站,但是不记得网址或者不想自己输入网址,所以在搜索引擎直接输入品牌名称或者与特定品牌有关的词。比方说,你想进...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片