首页 > 编程语言 >代码随想录算法训练营 | 491.递增子序列,46.全排列,47.全排列 II

代码随想录算法训练营 | 491.递增子序列,46.全排列,47.全排列 II

时间:2024-10-02 11:11:18浏览次数:1  
标签:排列 nums 46 res 随想录 int used new path

491.递增子序列
题目链接:491.递增子序列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰491.递增子序列
日期:2024-10-02

想法:根据题目nums[i]的范围在-100到100,可以用数组做记录是否同一层使用过
Java代码如下:

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

    public void backTracking(int[] nums, int startIndex) {
        if(path.size() > 1) {
            res.add(new ArrayList<>(path));
        }
        int[] used = new int[201];
        for(int i = startIndex; 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.removeLast();
        }
    }

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

46.全排列
题目链接:46.全排列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰全排列
日期:2024-10-02

想法:注意点:全排列结果数组大小跟原数组相同, 遍历得从头开始,不需要startIndex了,不能重复使用元素用used数组
Java代码如下:

class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> res = new ArrayList<>();
    boolean[] used;

    public void backTracking(int[] nums) {
        if(path.size() == nums.length) {
            res.add(new ArrayList<>(path));
        }
        for(int i = 0; i < nums.length; i++) {
            if(used[i] == true) {
                continue;
            }
            used[i] = true;
            path.add(nums[i]);
            backTracking(nums);
            path.removeLast();
            used[i] = false;
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        used = new boolean[nums.length];
        Arrays.fill(used, false);
        backTracking(nums);
        return res;
    }
}

47.全排列 II
题目链接:47.全排列 II
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰全排列 II
日期:2024-10-02

想法:加入同层去重,排列数组和i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false
Java代码如下:

class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> res = new ArrayList<>();
    boolean[] used;

    public void backTracking(int[] nums) {
        if(path.size() == nums.length) {
            res.add(new ArrayList<>(path));
        }
        for(int i = 0; i < nums.length; i++) {
            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false || used[i] == true) {
                continue;
            }
            used[i] = true;
            path.add(nums[i]);
            backTracking(nums);
            path.removeLast();
            used[i] = false;
        }
    }

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

标签:排列,nums,46,res,随想录,int,used,new,path
From: https://www.cnblogs.com/wowoioo/p/18444506

相关文章

  • 代码随想录算法-回溯4
    题目1491.非递减子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例1:输入:nums=[4,6,7,7]输出:[[4,6],[4......
  • Acwing-246. 区间最大公约数
    本蒟蒻的第二篇题解qwq.题目大意:给定一个长度为\(N\)的数组,需要在数组上进行两种操作:1.Clrd,表示把\(A[l],A[l+1],...,A[r]\)都加上\(d\).2.Qlr,表示询问\(A[l],A[l+1],...,A[r]\)的最大公约数\((GCD)\).错误解法:如果你是一个只会打暴力的小蒟蒻(就像我),看......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 ● 349. 两个数组的交集 ● 202.
    ​学习链接:https://programmercarl.com/哈希表理论基础.html学习笔记:遇到“要判断一个值是否在集合中出现过”的问题时,可以考虑hash表。hash表的形式包括数组、set、dict。当数的位数比较统一、或比较小,可用数组,快;当数的位数可变,可用set;当要同时考虑数的下标和值,可以用dict。......
  • 代码随想录算法训练营Day17 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜
    目录654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树654.最大二叉树题目654.最大二叉树-力扣(LeetCode)给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在......
  • 代码随想录算法训练营第六天|Day6哈希表基础
    242.有效的字母异位词题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html思路1.暴力的解法,两层为循环,很明显时间复杂度是O(n^2)。boolisAnagram(char*s,char*t){if(......
  • 2246 记录保存 map
    解决思路 读取输入:读取每组奶牛的名字。 排序:对每组奶牛的名字进行排序,以确保相同的组合总是以相同的顺序出现。 记录出现次数:使用 map 记录每组奶牛组合出现的次数。 计算最大次数:遍历 map,找到出现次数最多的组合。#include<bits/stdc++.h>#definell......
  • 代码随想录算法训练营第六天|理解hash表
    WhatisHashTable?引用自文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。哈希函数通过hashCode把......
  • 转载 fastapi 部署 原文链接:https://blog.csdn.net/FrenzyTechAI/article/details/132
    sudoadd-apt-repositoryppa:deadsnakes/ppasudoaptupdatesudoaptinstallpython3.12python3.12-venv-ysudoaptinstallsupervisorsudoaptinstallsupervisornginx-y启用并启动Supervisor:sudosystemctlenablesupervisorsudosystemctlstartsupervisor使用ena......
  • 代码随想录一刷day2
    T27移除元素   注意复习思路快慢指针:快指针:指向遍历的元素慢指针:指向需要替换的元素实现:slowIndex=0;通过遍历fastIndex,当target!=nums【fastIndex】,nums【slowIndex++】=nums【fastIndex】; T26理解快慢指针 nums[fast]!=nums[slow]时,交换两个的值且slow++;其他就f......
  • C++-练习-46
    题目:许多州的彩票发行机构都使用如下所示程序的简单彩票的变体。在这些玩法中,玩家从一组被称为域号码的号码中选择几个。列如,可以从域号码1~47中选择5个号码;还可以从第二个区间(如1~27)选择一个号码(称为特选号码)。要赢得头奖,必须正确猜中所有的号码。中头奖的几率是选择所有域号......