首页 > 编程语言 >算法笔记|Day22回溯算法IV

算法笔记|Day22回溯算法IV

时间:2024-08-11 15:54:13浏览次数:12  
标签:used 题目 nums int Day22 算法 path IV leetcode

算法笔记|Day22回溯算法IV

☆☆☆☆☆leetcode 491.递增子序列

题目链接:leetcode 491.递增子序列

题目分析

本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了,可以用数组来做哈希。注意used数组是记录本层元素是否重复使用,新的一层used都会重新定义(清空),所以要知道used只负责本层,回溯并不需要赋值恢复。

代码

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new ArrayList<>();

    public List<List<Integer>> findSubsequences(int[] nums) {
        backtracking(nums,0);
        return res;
    }

    public void backtracking(int nums[],int start){
        int used[]=new int[201];        
        if(path.size()>1)
            res.add(new ArrayList(path));
        for(int i=start;i<nums.length;i++){
            if(!path.isEmpty()&&nums[i]<path.get(path.size()-1)||used[nums[i]+100]==1)
                continue;
            path.add(nums[i]);
            used[nums[i]+100]=1;
            backtracking(nums,i+1);
            path.remove(path.size()-1);
        }
    }
}

☆☆☆☆☆leetcode 46.全排列

题目链接:leetcode 46.全排列

题目分析

排列问题仍然可以使用回溯,同样使用used数组,记录此时path里都有哪些元素使用,一个排列里一个元素只能使用一次。

代码

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new ArrayList<>();

    public List<List<Integer>> permute(int[] nums) {
        int used[]=new int[nums.length];
        backtracking(nums,used);
        return res;
    }

    public void backtracking(int nums[],int used[]){
        if(path.size()==nums.length){
            res.add(new ArrayList(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(used[i]==1)
                continue;
            path.add(nums[i]);
            used[i]=1;
            backtracking(nums,used);
            path.remove(path.size()-1);
            used[i]=0;
        }
    }
}

☆☆☆☆☆leetcode 47.全排列II

题目链接:leetcode 47.全排列II

题目分析

所求排列不能重复,需要去重的逻辑,对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用。另外,注意到对于排列问题,树层上去重和树枝上去重,都是可以的,但是树层上去重效率更高!

代码

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new LinkedList<>();

    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        int used[]=new int[nums.length];
        backtracking(nums,used);
        return res;
    }

    public void backtracking(int nums[],int used[]){
        if(path.size()==nums.length){
            res.add(new ArrayList(path));
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(used[i]==1)
                continue;
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)
                continue;
            path.add(nums[i]);
            used[i]=1;
            backtracking(nums,used);
            path.remove(path.size()-1);
            used[i]=0;
        }
    }
}

提示:
去重逻辑中:
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)//树层去重
continue;
改为
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==1)//树枝去重
continue;
效果相同。

☆☆☆☆☆leetcode 332.重新安排行程(待补充)

题目链接:leetcode 332.重新安排行程

题目分析

代码


☆☆☆☆☆leetcode 51. N皇后(待补充)

题目链接:leetcode 51. N皇后

题目分析

代码


☆☆☆☆☆leetcode 37. 解数独(待补充)

题目链接:leetcode 37. 解数独

题目分析

代码


标签:used,题目,nums,int,Day22,算法,path,IV,leetcode
From: https://blog.csdn.net/m0_57632621/article/details/141105176

相关文章

  • 【WSN覆盖优化】基于斑马优化算法ZOA求解无线传感器节点2D覆盖优化问题附Matlab代码
    以下是一个简单的示例Matlab代码,演示如何使用斑马优化算法(ZebraOptimizationAlgorithm,ZOA)来解决无线传感器节点(WSN)的2D覆盖优化问题:ini复制%ZebraOptimizationAlgorithm(ZOA)forWirelessSensorNetwork(WSN)CoverageOptimization%设置参数num_nodes=50;......
  • 探索Python中的插入排序算法
    探索Python中的插入排序算法插入排序(InsertionSort)是一种简单直观的排序算法。虽然在大规模数据集上效率不如一些高级排序算法,但插入排序在处理小规模数据集或部分有序的数据时表现非常优秀。本文将介绍插入排序的工作原理、实现方法以及它的时间复杂度。插入排序的工作......
  • Dijkstra算法
    Dijkstra算法是一种用于在加权图中寻找单源最短路径的算法。它由荷兰计算机科学家EdsgerDijkstra在1956年提出。该算法基于贪心策略,通过不断选择当前最短路径上的顶点来逐步确定最短路径。它使用一个距离数组来记录起始点到每个顶点的距离,并使用一个集合来存储已经求得最短路......
  • 图像分割算法
    5.1阈值分割(Thresholding)介绍阈值分割是一种简单而有效的图像分割方法,通过设置一个或多个阈值,将图像分割为前景和背景区域。常见的阈值分割方法包括全局阈值、自适应阈值和Otsu阈值。原理阈值分割通过比较像素值与设定的阈值,将像素分类为前景或背景。公式在阈值分割......
  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......
  • 安装双系统(Ubuntu)后NVIDIA驱动无法使用(Make sure that the latest NVIDIA driver is i
    首先问题描述:使用nvidia-smi命令去查看Nvidia显卡的使用情况的时候报错如下:(base)root@TGONE:#nvidia-smiNVIDIA-SMIhasfailedbecauseitcouldn'tcommunicatewiththeNVIDIAdriver.MakesurethatthelatestNVIDIAdriverisinstalledandrunning.引言在......
  • 7-2广告算法业务
    1.两种广告广告按其投放目的可以分成两类:效果广告和品牌广告。效果广告是为了直接提升某个产品的用户数量或者销售收入。而品牌广告则是为了通过提升品牌知名度美誉度从而间接带来该品牌产品用户和销售收入的增长。大家所熟悉的互联网广告大部分都是效果广告。如:微信的朋......
  • Day25 第七章 回溯算法part04 回溯终章
    目录任务491.递增子序列思路46.全排列思路47.全排列II思路心得体会任务491.递增子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序......
  • 7-1推荐算法业务
    1.推荐算法业务入门搜索和推荐搜索是人找物,而推荐是物找人。搜索一般用来满足用户比较明确的需求,而推荐则可以用来满足用户相对模糊的需求。大家熟悉的推荐系统包括抖音短视频、今日头条新闻推荐、网易云音乐每日推荐、淘宝京东的猜你喜欢推荐、B站的视频推荐等等。大家熟......
  • 基于模拟退火算法求解旅行商(TSP)问题(附word文档)
    基于模拟退火算法求解旅行商(TSP)问题(附word文档)......