代码随想录day29 回溯开始进入排列问题

news/2024/7/23 23:21:19 标签: 算法, 模拟退火算法

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]]

思考

这题初看想用子集的方法来做,但是发现存在一个问题,怎么能判断单调递增呢,这里通过一个判断条件,如果遍历的nums[i]大于path.back(),那么证明这个数大于path内所有的数,可以push back,同时我门需要增加一个set,作用是去重,即如果发现遍历的nums[i]不在set里,那么可以push back,因为每次遍历的时候set都要insert nums[i]

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, int startIndex) {

        if(path.size() > 1) {

            res.push_back(path);

        }

        unordered_set<int> uset;

        for(int i = startIndex;  i < nums.size(); i++) {

            if((path.size() > 0 && 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();

        }

    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {

        backTracking(nums, 0);

        return res;

    }

};

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]是同一个,而排列不是,所以排列里不需要startIndex,但是排列也需要used数组来在横向遍历时判断这个数有没有被取过,因为每次横向遍历都是从第0位开始

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, vector<int> used) {

        if(path.size() == nums.size()) {

            res.push_back(path);

            return;

        }

        for(int i = 0; i < nums.size(); i++) {

            if(used[i] == 1) continue;

            path.push_back(nums[i]);

            used[i] = 1;

            backTracking(nums, used);

            used[i] = 0;

            path.pop_back();

        }

    }

    vector<vector<int>> permute(vector<int>& nums) {

        vector<int> used(nums.size(), 0);

        backTracking(nums, used);

        return res;

    }

};

47.全排列 II

题目

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

  • 输入:nums = [1,1,2]
  • 输出: [[1,1,2], [1,2,1], [2,1,1]]

思考

全排列多了一个去重操作,回溯问题的去重操作都是一样的:

if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;

还要记得将原数组sort一下

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, vector<int> used) {

        if(path.size() == nums.size()) {

            res.push_back(path);

            return;

        }

        for(int i = 0; i < nums.size(); i++) {

            if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;

            if(used[i] == 0) {

                path.push_back(nums[i]);

                used[i] = 1;

                backTracking(nums, used);

                used[i] = 0;

                path.pop_back();

            }

        }

    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {

        sort(nums.begin(), nums.end());

        vector<int> used(nums.size(), 0);

        backTracking(nums, used);

        return res;

    }

};


http://www.niftyadmin.cn/n/5322804.html

相关文章

Roscpp中构造函数与析构函数及在无人机串口通信应用

1. 概念辨析 构造函数 作用&#xff1a;初始化&#xff0c;在创建对象时会自动调用&#xff0c;有点像Python中的 __init__ 方法 特点&#xff1a;命名为class命名&#xff0c;在public中声明。 析构函数 作用&#xff1a;完成释放前的一些清理工作。 特点&#xff1a;命名…

翻译: Streamlit从入门到精通 基础控件 一

这个关于Streamlit的教程旨在帮助数据科学家或机器学习工程师&#xff0c;他们不是网络开发者&#xff0c;也不想花费数周时间学习使用这些框架来构建网络应用程序。 1. 什么是Streamlit&#xff1f; Streamlit是一个免费且开源的框架&#xff0c;用于快速构建和共享美观的机器…

HarmonyOS的应用类型(FA vs Stage)

HarmonyOS目前提供两种应用模型 FA(Feature Ability)模型: HarmonyOS API 7开始支持的模型,已经不再主推。 Stage模型: HarmonyOS API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的…

快速了解——逻辑回归及模型评估方法

一、逻辑回归 应用场景&#xff1a;解决二分类问题 1、sigmoid函数 1. 公式&#xff1a; 2. 作用&#xff1a;把 (-∞&#xff0c;∞) 映射到 (0&#xff0c; 1) 3. 数学性质&#xff1a;单调递增函数&#xff0c;拐点在x0&#xff0c;y0.5的位置 4. 导函数公式&#xff1a;f…

Github Copilot 的使用方法和快捷键

GitHub Copilot 是一个强大的工具&#xff0c;可以大大提高编程效率。通过结合注释和代码提示&#xff0c;您可以快速生成复杂的代码结构。不过&#xff0c;作为一名开发者&#xff0c;您仍需要对生成的代码进行审查和调整&#xff0c;以确保它满足项目的需求和标准。本文会介绍…

2024--Django平台开发-Django知识点(六)

day06 Django知识点 今日概要&#xff1a; Form和ModelForm组件【使用】【源码】缓存【使用】ORM【使用】其他&#xff1a;ContentTypes、Admin、权限、分页、信号等 1.Form和ModelForm组件 背景&#xff1a;某个公司后台管理项目。 垃圾 def register(request):"&quo…

OpenCV-23中值滤波

一、概念 中值滤波原理比较简单&#xff0c;假设有一个数组[1556789],取其中的中间值&#xff08;即中位数&#xff09;作为卷积后的结果即可&#xff0c;中值滤波对胡椒噪音&#xff08;也叫椒盐噪音&#xff09;效果明显。 对下面带胡椒噪声的图片进行处理。 注意点&#x…

【深度学习目标检测】十六、基于深度学习的麦穗头系统-含GUI和源码(python,yolov8)

全球麦穗检测是植物表型分析领域的一个挑战&#xff0c;主要目标是检测图像中的小麦麦穗。这种检测在农业领域具有重要意义&#xff0c;可以帮助农民评估作物的健康状况和成熟度。然而&#xff0c;由于小麦麦穗在视觉上具有挑战性&#xff0c;准确检测它们是一项艰巨的任务。 全…