美文网首页
算法分析 [回溯算法] 2019-02-26

算法分析 [回溯算法] 2019-02-26

作者: 哓晓的故事 | 来源:发表于2019-02-26 17:15 被阅读0次

1. 回溯算法

分析
框架 这个框架的好处是,

  1. 之前的值都能用temp保存住
  2. 并且使用temp剪纸函数
  3. 若是存在重复数,需要去重,先排序,然后nums[i] == nums[i-1]做去重
public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> rs = new ArrayList<>();
        backtrack(rs, new ArrayList<>(), nums, 0);
        return rs;
    }
    
    private void backtrack(List<List<Integer>> rs, List<Integer> temp, int []nums, int start) {
        // 这里是回溯的剪纸函数
        rs.add(new ArrayList<>(temp));
        for(int i=start; i<nums.length; i++) {
            temp.add(nums[i]);
            backtrack(rs, temp, nums, i+1);
            temp.remove(temp.size()-1);
        }
    }

1.1 从集合总进行组合,等于目标值,求组合数

39. 组合总和(对内部值进行累加,值可以重复使用) Combination Sum medium
法1. 回溯法 时间复杂度O(n^2)
每次进入函数

  1. 先判断是否值<0,return
  2. 值==0,add(new ArrayList<>(temp));
  3. 每次循环完成,,才进行++

40. 组合总和 II(对内部值进行累加,值不可重复使用) Combination Sum II medium
(重要)先将集合排序
每次循环先入列表,每次循环进入都+1,进入循环前先判断当前i>idx && nums[i] == nums[i-1]
这个步骤可以去重判断,之所以可以这么用,是因为一开始先排序
递归初次已经处理了,顺序遍历的时候与前值相等就可以略去

1.2 获取集合中所有的子集

78. 子集(无重叠数值) Subsets medium
法1. 回溯法 时间复杂度O(n^2)
每次循环先入列表,每次循环进入都++

90. 子集(有重叠数值,且子集不能重复) Subsets II medium
法1. 回溯法 时间复杂度O(n^2)
先将集合排序
每次循环先入队列,每次循环进入都++,进入循环前先判断当前i>idx && nums[i] == nums[i-1] // 这个步骤可以去重判断,之所以可以这么用,是因为一开始先排序了

1.3 从集合总进行组合,组合不能重复

46. 全排列 Permutations medium
法1. 回溯法 时间复杂度O(n^2)
每次循环,通过temp判断是否已经在上次处理过对应的值
法2. 回溯法 时间复杂度O(nlogn)
每次循环,交换start和当前i所在的位置,递归的时候从第idx+1开始

            for(int i=idx; i<nums.length; i++) {
                swap(nums, idx, i);
                dp(rs, nums, idx+1);
                swap(nums, i, idx);
            }

47. Permutations II

17. 输入数组返回所有对应字母的组合 Letter Combinations of a Phone Number
法1. 回溯法 时间复杂度O(n^2)
每次获取数字对应的字符列表,对字符列表进行回溯

1.4 从字符串中分割回纹数

131. 分割回纹数 Palindrome Partitioning medium
法1. 回溯法 时间复杂度O(n^2)
每个字符串按照substring()切割,并判断是否是回纹数,是回纹数入列表,否者

相关文章

  • 算法分析 [回溯算法] 2019-02-26

    1. 回溯算法 分析框架 这个框架的好处是, 之前的值都能用temp保存住 并且使用temp做剪纸函数 若是存在重...

  • 回溯算法

    回溯算法 回溯算法介绍   回溯算法并不是非常复杂的算法, 很多人接触过但是未必知道这是回溯算法; 典型的回溯算法...

  • 回溯算法:八皇后问题和0-1背包问题

    文章结构 如何理解回溯算法 回溯算法的经典应用 完整源码 图片来源 1. 如何理解回溯算法 1.1 什么是回溯算法...

  • Algorithm进阶计划 -- 回溯算法

    滑动窗口算法回溯算法框架回溯算法运用 1. 回溯算法框架 回溯算法,是类似枚举的搜索尝试过程,主要是在搜索尝试过程...

  • 回溯算法

    回溯算法的原理是深度优先搜索(dfs),然后分析题目寻找剪枝的方法以此来优化算法,降低时间复杂度。 回溯算法有一个...

  • 回溯算法总结

    回溯法学习总结 回溯算法也是算法导论中常用的算法,回溯算法类似于暴力求解算法,经常用在求可能解的问题。下面我将从三...

  • 12.矩阵路径

    思路: 使用回溯算法 回溯算法的实现方式是利用递归 可以借助画树形图来分析所需要的变量和条件 具体细节: 定义好终...

  • 77. Combinations.go

    回溯算法

  • 回溯算法之-组合总和

    回溯算法模版 首先上一套回溯算法模版,很多回溯算法都可以使用该模版解决 leetcode 39 组合总和 给定一个...

  • 递归2-回溯与递归

    I. 回溯算法基础 回溯与递归的区别和联系  很多人不理解回溯与递归到底是什么关系。其实很简单,回溯算法是一种算法...

网友评论

      本文标题:算法分析 [回溯算法] 2019-02-26

      本文链接:https://www.haomeiwen.com/subject/csfzyqtx.html