代码随想录第25天 | * 491.递增子序列 * 46.全排列 * 47.全排列 II

news2024/11/25 7:02:47

491.递增子序列

自己的做法:

      /**
       * @param {number[]} nums
       * @return {number[][]}
       */
      let road = [];
      let path = [];
      var findSubsequences = function (nums) {
        road = []; //road会有之前的数据,所以需要每次清空road
        brektraning(nums, 0);
        let obj = {};
        road.forEach((val) => {
          // 此处不能用 obj.name = '属性值'的方式 因为此处的val是变量,不是固定值
          obj[val] = val;
        });
        result = [];
        for (let key in obj) {
          result.push(key.split(",").map(Number));
        }
        return result;
      };

      const brektraning = function (nums, er) {
        for (let i = er; i < nums.length; i++) {
          path.push(nums[i]);
          min = nums[i];
          brektraning(nums, i + 1);
          if (path.length >= 2 && grt(path)) road.push([...path]); //push不能为数组,所以只能先展开
          path.pop();
          while (nums[i + 1] && nums[i] === nums[i + 1]) i++; //去重
        }
      };
      let grt = function (s) {
        for (let i = 0; i < s.length - 1; i++) {
          if (s[i] > s[i + 1]) return false;
        }
        return true;
      };


第一想法

子集的方法,在返回结果时判断是否相同和是否大于,但内存和时间都很复杂。
不判断的话,会出现 [1,2,3,4,5,6,7,8,9,10,1,1,1,1,1] 这样的出错


困难

  • 二维数组的去重

Set去重是比较数组中存入的值,当数组内值为简单数据类型,存入的就是值本身。比较的就是值本身。而二维数组存入的值为地址值,即使存入的相同,地址值也会不同。所以无法使用Set来进行去重。

  • while (nums[i + 1] && nums[i] === nums[i + 1]) i++; 用这个去重是否有效?

无效!因为之前的 子集的题目都是从大到小的排列好了的,这道题明显不是


卡哥的做法:

var findSubsequences = function(nums) {
    let result = []
    let path = []
    function backtracing(startIndex) {
        if(path.length > 1) {
            result.push(path.slice())
        }
        let uset = []
        for(let i = startIndex; i < nums.length; i++) {
            if((path.length > 0 && nums[i] < path[path.length - 1]) || uset[nums[i] + 100]) {
                continue
            }
            uset[nums[i] + 100] = true
            path.push(nums[i])
            backtracing(i + 1)
            path.pop()
        }
    }
    backtracing(0)
    return result
};

思路打开!

在这里插入图片描述

  • 同一父节点下的同层上使用过的元素就不能再使用了

uset[nums[i] + 100] 用哈希


6.全排列

 /**
       * @param {number[]} nums
       * @return {number[][]}
       */

      var permute = function (nums) {
        let count = nums.length;
        let result = [];
        let path = [];
        let uset = new Array(count);
        uset.fill(0);
        backtracing(nums, uset);
        return result;

        function backtracing(nums, uset) {
          if (path.length === nums.length) {
            result.push(path.slice());
          }
          for (let i = 0; i < nums.length; i++) {
            if (uset[i]) {
              continue;
            }
            path.push(nums[i]);
            uset[i] = 1;
            backtracing(nums, uset);
            path.pop();
            uset[i] = 0;
          }
        }
      };

第一想法

因为数组里的数不重复,想的是哈希,如果是用过的,哈希为1。
但这个哈希竖着来,横着要清空,所以在pop()后要复原。
但是搞的时候没弄出来

backtracing在外面的时候,result为0,不知道为什么


思路

在这里插入图片描述


47.全排列 II

法一:

  /**
       * @param {number[]} nums
       * @return {number[][]}
       */
      var permuteUnique = function (nums) {
        let count = nums.length;
        let result = [];
        let path = [];
        let uset = new Array(count);
        uset.fill(0);
        backtracing(nums, uset);
        let obj = {};
        result.forEach((val) => {
          // 此处不能用 obj.name = '属性值'的方式 因为此处的val是变量,不是固定值
          obj[val] = val;
        });
        road = [];
        for (let key in obj) {
          road.push(key.split(",").map(Number));
        }
        return road;

        function backtracing(nums, uset) {
          if (path.length === nums.length) {
            result.push(path.slice());
          }
          for (let i = 0; i < nums.length; i++) {
            if (uset[i]) {
              continue;
            }
            path.push(nums[i]);
            uset[i] = 1;
            backtracing(nums, uset);
            path.pop();
            uset[i] = 0;
          }
        }
      };

法二:

  /**
       * @param {number[]} nums
       * @return {number[][]}
       */
      var permuteUnique = function (nums) {
        let count = nums.length;
        nums.sort((a,b)=>a-b)
        let result = [];
        let path = [];
        let uset = new Array(count);
        uset.fill(0);
        backtracing(nums, uset);
        return result;

        function backtracing(nums, uset) {
          if (path.length === nums.length) {
            result.push(path.slice());
          }
          for (let i = 0; i < nums.length; i++) {
            if (uset[i]) {
              continue;
            }
            path.push(nums[i]);
            uset[i] = 1;
            backtracing(nums, uset);
            path.pop();
            uset[i] = 0;
            while (nums[i + 1]!==undefined && nums[i] === nums[i + 1]) i++; //去重
          }
        }
      };

第一想法

法一:嘿嘿,上一题的结果拿来去重。

法二:sort然后在上一题的基础上面去重
在这里插入图片描述


困难

  • [0,1,0,0,9]过不了

while (nums[i + 1] && nums[i] === nums[i + 1]) i++; //去重
有问题,要写成nums[i + 1]!==undefined

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot校园二手书交易管理系统

本次设计任务是要设计一个乐校园二手书交易管理系统&#xff0c;通过这个系统能够满足乐校园二手书交易的管理员及卖家用户和用户二手书交易信息管理功能。系统的主要功能包括首页、个人中心、用户管理、卖家用户管理、图书分类管理、二手图书管理、求购图书管理、求购回复管理…

复习opencv:螺丝螺纹缺陷检测

螺牙缺陷检测 简述去噪椒盐噪声高斯噪声 小波变换引导滤波求最大凸包判断曲直全部代码 简述 今天收到了一个检测螺牙缺陷的问题&#xff0c;当复习opencv练个手&#xff0c;记录一下基础知识。这里的代码是检测弯曲的&#xff0c;其他缺陷用yolo处理。东家给的图片有的是有干扰…

激活函数》

一. 常用激活函数 1. Sigmoid函数 优点与不足之处 对应pytorch的代码 import torch import torch.nn as nn# Sigmoid函数 print(**25"Sigmoid函数""*"*25) m nn.Sigmoid() input torch.randn(2) print("原&#xff1a;",input) print("结…

RabbitMQ ---- Work Queues

RabbitMQ ---- Work Queues 1. 轮训分发消息1.1 抽取工具类1.2 启动两个工作线程1.3 启动一个发送线程1.4 结果展示 2. 消息应答2.1 概念2.2 自动应答2.3 消息应答的方法2.4 Multiple 的解释2.5 消息自动重新入队2.6 消息手动应答代码2.7 手动应答效果演示 3. RabbitMQ 持久化3…

RT-Thread 互补滤波器 (STM32 + 6 轴 IMU)

作者&#xff1a;wuhanstudio 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/611568999 最近在看无人驾驶的 Prediction 部分&#xff0c;可以利用 EKF (Extended Kalman Filter) 融合不同传感器的数据&#xff0c;例如 IMU, Lidar 和 GNSS&#xff0c;从而给出更加准确的…

Go——基础语法

目录 Hello World&#xff01; 变量和常量 变量交换 匿名变量 常量 iota——特殊常量 基本数据类型 数据类型转换 运算符 算数运算符 关系运算符 逻辑运算符 位运算符号 ​编辑 赋值运算符 输入输出方法 流程控制 函数 可变参数类型 值传递和引用传递 Hello Wor…

性能测试 jmeter 的 beanshell 脚本的 2 个常用例子

目录 前言&#xff1a; Bean Shell 内置变量大全 例子 1 例子 2 技巧 前言&#xff1a; JMeter是一个功能强大的性能测试工具&#xff0c;而Beanshell是JMeter中用于编写脚本的一种语言。 在利用 jmeter 进行接口测试或者性能测试的时候&#xff0c;我们需要处理一些复杂…

使用GithubAction自动构建部署项目

GitHub Actions 是一种持续集成和持续交付(CI/CD) 平台&#xff0c;可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求&#xff0c;或将合并的拉取请求部署到生产环境。 GitHub Actions 不仅仅是DevOps&#xff0c;还允许您在存储库中…

基于linux下的高并发服务器开发(第一章)-GCC(2)1.3

04 / gcc 和 g的区别 gcc 和 g都是GNU&#xff08;组织&#xff09;的一个编译器 【误区一】&#xff1a;gcc只能编译 C 代码&#xff0c;g 只能编译 c 代码。两者都可以&#xff0c;请注意&#xff1a; 后缀为 .c 的&#xff0c;gcc 把它当做是 C 程序&#xff0c;而 g 当做是…

Debezium系列之:prometheus采集debezium的jmx数据,grafana通过dashboard展示debezium的jmx数据

Debezium系列之:prometheus采集debezium的jmx数据,grafana通过dashboard展示debezium的jmx数据 一、需求背景二、实现的效果三、导出debezium jmx四、debezium jmx重要指标五、部署prometheus和grafana六、Debezium MySQL Connector的dashboard七、debezium-dashboard.json八…

二叉树(上)——“数据结构与算法”

各位CSDN的uu们好呀&#xff0c;好久没有更新我的数据结构与算法专栏啦&#xff0c;今天&#xff0c;小雅兰继续来更新二叉树的内容&#xff0c;下面&#xff0c;让我们进入链式二叉树的世界吧&#xff01;&#xff01;&#xff01; 二叉树链式结构的实现 二叉树链式结构的实现…

性能测试工具 Jmeter 测试 Dubbo 接口脚本编写

目录 前言&#xff1a; 1、背景 2、工具准备 3、创建一个 maven 项目&#xff0c;此处可以创建一个 quickstart&#xff0c;参考截图 4、以上配置完毕后&#xff0c;开始撸代码 5、上面那个类是不需要从 jmeter 中获取参数&#xff0c;如果要从 jmeter 中获取相关的参数&…

低代码在边缘计算工业软件中的应用

近年来&#xff0c;边缘计算给工业现场带来了许多新的变化。由于计算、储存能力的大幅提升&#xff0c;边缘计算时代的新设备往往能够胜任多个复杂任务。另外&#xff0c;随着网络能力的提升&#xff0c;边缘设备与设备之间、边缘设备与工业互联网云平台之间的通讯延迟与带宽都…

Flowable边界事件-信号边界事件

信号边界事件 信号边界事件一、定义1. 图形标记2. 设置信号 选择信号3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 信号边界事件测试用例 总结 信号边界事件 一、定义 接收到信号触发事件 1. 图形标记 2. 设置信号 选择信号 3. XML标记 定时边界事件的XML <signal…

JMeter进行WebSocket压力测试

背景 之前两篇内容介绍了一下 WebSocket 和 SocketIO 的基础内容。之后用 Netty-SocketIO 开发了一个简单的服务端&#xff0c;支持服务端主动向客户端发送消息&#xff0c;同时也支持客户端请求&#xff0c;服务端响应方式。本文主要想了解一下服务端的性能怎么样&#xff0c;…

驱动开发-day9

驱动代码&#xff1a; #include <linux/cdev.h> #include <linux/device.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linu…

Hystrix熔断器

雪崩 当山坡积雪内部的内聚力抗拒不了它所受到的重力拉引时&#xff0c;积雪便向下滑动&#xff0c;引起⼤量雪体崩塌&#xff0c;人们把这种自然现象称作雪崩 微服务中&#xff0c;一个请求可能需要多个微服务接口才能实现&#xff0c;会形成复杂的调用链路 …

在Linux下通过MySQL二进制包安装MySQL5.7

在Linux下通过通用压缩包安装MySQL5.7 卸载MySQL 如果是第一次安装MySQL&#xff0c;在安装MySQL前&#xff0c;知道如何卸载MySQL是很有必要的。因为在安装过程中可能会 遇到各种各样的问题&#xff0c;自己玩的话 卸载重装即可。 1. find / -name mysql 查看MySQL相关包…

Layui之动态树 左侧树形菜单栏 详细全面

⭐ฅʕ•̫͡•ʔฅ本期看点&#xff1a;该篇是运用Layui框架来编写后台树形菜单栏&#xff0c;并且结合MySql来编写完成 目录 一.效果图 二.具体步骤 2.1 数据库 2.2 树形导航栏 第一个类&#xff1a;Treevo 第二个类&#xff1a;BuildTree&#xff1a; 2.3 Dao方法 2.3.…

【自我提升】Spring Data JPA之Specification动态查询详解

写在前面&#xff1a;刷完Spring Data JPA的课后&#xff0c;发现Specification动态查询还挺有意思的&#xff0c;还应用到了规约设计模式&#xff0c;在此记录下学习过程和见解。 目录 一、应用场景 二、源码解析 三、规约模式 四、实际应用 一、应用场景 1. 简介 有时我…