Leetcode刷题笔记--Hot21-30

news2025/1/15 20:45:38

1--全排列(46)

主要思路1:

        经典全排列,每次枚举每一位时,重头开始枚举,用一个访问数组记录当前已经被访问过的数字;

        这道题不包含重复数字,所以不需要进行树层上的剪枝;

#include <iostream>
#include <vector>

class Solution {
public:
    std::vector<std::vector<int>> permute(std::vector<int>& nums) {
        if(nums.size() == 0) return res;
        std::vector<bool> vis(nums.size(), false);
        std::vector<int> tmp;
        dfs(nums, vis, tmp);
        return res;
    }

    void dfs(std::vector<int>& nums, std::vector<bool>& vis, std::vector<int> &tmp){
        if(tmp.size() == nums.size()){
            res.push_back(tmp);
            return;
        }
        for(int i = 0; i < nums.size(); i++){
            if(vis[i] == true) continue;
            tmp.push_back(nums[i]);
            vis[i] = true;
            dfs(nums, vis, tmp);
            // 回溯
            tmp.pop_back();
            vis[i] = false;
        }
    }
private:
    std::vector<std::vector<int>> res;
};

int main(int argc, char *argv[]){
    std::vector<int> test = {1,2,3};
    Solution S1;
    std::vector<std::vector<int>> res = S1.permute(test);
    for(auto v : res){
        for(auto i : v) std::cout << i << " ";
        std::cout << std::endl;
    }
}

主要思路2:

        可以利用下一个排列的思想来枚举全排列,首先需要将数组进行从小到大排序,然后不断求解下一个排列,一个下一个排列就是一个新的排列,直到最大的排列为止;

#include <iostream>
#include <vector>
#include <algorithm>

class Solution {
public:
    std::vector<std::vector<int>> permute(std::vector<int>& nums) {
        if(nums.size() == 0) return res;
        std::sort(nums.begin(), nums.end()); // 从小到大排列
        res.push_back(nums); // 记录最小的排列
        while(nextp(nums)){
            res.push_back(nums);
        }
        return res;
    }

    bool nextp(std::vector<int>& nums){
        int n = nums.size();
        // 找到第一个顺序对
        int i;
        for(i = n - 2; i >= 0; i--){
            if(nums[i] < nums[i+1]) break;
        }
        if(i == -1) return false; //已经是最大排列了

        // 找到一个nums[j] > 上面的nums[i]
        int j;
        for(j = n - 1; j > i; j--){
            if(nums[j] > nums[i]) break;
        }

        // 交换nums[i] 和 nums[j]
        std::swap(nums[i], nums[j]);
        // 反转num[i+1] ~ nums.end()
        std::reverse(nums.begin() + i + 1, nums.end());
        return true;
    }

private:
    std::vector<std::vector<int>> res;
};

int main(int argc, char *argv[]){
    std::vector<int> test = {1,2,3};
    Solution S1;
    std::vector<std::vector<int>> res = S1.permute(test);
    for(auto v : res){
        for(auto i : v) std::cout << i << " ";
        std::cout << std::endl;
    }
}

2--旋转图像(48)

主要思路:

         按层(圈)来旋转,对于坐标为(r, c)的值,其旋转后的坐标为(c, n - 1 - r),且每四个(上,右,下,左)为一个循环节,循环交换循环节中四个元素即可,视频讲解参考:旋转图像

#include <iostream>
#include <vector>
#include <algorithm>

class Solution {
public:
    void rotate(std::vector<std::vector<int>>& matrix) {
        int n = matrix.size();
        // 按层(圈)处理
        for(int L = n; L > 0; L -= 2){
            // 左上角起始元素
            int row = (n - L) / 2;
            int col = row;

            // 当前这一行,顶行的前 L-1 个元素
            for(int k = 0; k < L - 1; k++){
                // 当前元素
                int r = row, c = col + k;
                int tmp = matrix[r][c];
                // 从(r, c)开始寻找循环节,循环节的长度一定是4
                for(int i = 0; i < 4; i++){
                    // 旋转后的坐标
                    int rr = c;
                    int cc = n - 1 - r;
                    // 旋转
                    std::swap(tmp, matrix[rr][cc]);
                    r = rr;
                    c = cc;
                }
            }
        }
    }
};
int main(int argc, char *argv[]){
    std::vector<std::vector<int>> test = {{1,2,3}, {4,5,6}, {7,8,9}};
    Solution S1;
    S1.rotate(test);
    for(auto v : test){
        for(auto i : v) std::cout << i << " ";
        std::cout << std::endl;
    }
}

3--字母异位词分组(49)

主要思路:

        

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

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

相关文章

【机器学习】python基础实现线性回归

手写梯度下降的实现ykxb的线性回归 算法步骤&#xff1a; &#xff08;1&#xff09;构造数据&#xff0c;y3*x5; &#xff08;2&#xff09;随机初始化和&#xff0c;任意数值&#xff0c;例如9,10; &#xff08;3&#xff09;计算&#xff0c;,并计算 &#xff08;4&…

Linux基本指令【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;浅识操作系统&#x1f449;&#x1f3fb;ls.和. .sta…

【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

文章目录 1.map的介绍2.map的使用2.1map的构造函数2.2map的迭代器2.3map的容量和访问函数2.4map的增删查改函数 1.map的介绍 map的介绍 &#xff08;1&#xff09;map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 &#xff…

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…

Docker Desktop 笔记

https://blog.csdn.net/qq_39611230/article/details/108641842 https://blog.csdn.net/KgdYsg/article/details/118213499 1、修改配置 {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://…

PHP自己的框架session()使用(完善篇六)

1、PHP自己的框架session() 2、session类&#xff08;SessionBase.php&#xff09; <?php class SessionBase {/*** 设置session*/public static function set($name, $data, $expire600){$session_data array();$session_data[data] $data;$session_data[expire] time…

Vue使用Animate.css

说一下Animate.css这个动画库&#xff0c;很多的动画在这个库里面都定义好了&#xff0c;我们用的时候可以直接使用里面的类名就可以了&#xff0c;就是直接目标元素绑定对应的类名就可以实现动画效果&#xff0c;非常方便&#xff0c;库其实也相对简单&#xff0c;使用起来也简…

IDEA 一键清除所有的无效引用

快捷键 // windows版本 CtrlAltO//mac版本 controloptionO 使用方式 1. 清除单个类中的无效的import, 打开具体的类。然后使用快捷键。 2. 清除整个项目的无效引用&#xff0c;左键点击项目名&#xff0c;然后使用快捷键&#xff0c;会出现以下提示。按Run即可。

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…

2. HBase中文学习手册之如何运行一个单机版的HBase?

HBase中文学习手册之如何运行一个单机版的HBase? 1.1 介绍1.2 快速开始1.2.1 安装 Open JDK 81.2.2 启动 HBase1.2.3 Shell 练习1.2.4 运行停止脚本来停止HBase 1.1 介绍 上篇博文HBase中文学习手册之揭开Hbase的神秘面纱分享了 HBase 的一些理论基础知识的介绍。 本文将会继…

MAYA粒子基础_场

重力场 牛顿场 径向场 均匀场和重力场的区别 空气场 推动物体 阻力场 推动物体 涡流场 湍流场 体积轴场

ubuntu 22.04 LTS openai triton 安装

第一种方法&#xff1a; pip install triton 第二种方法&#xff0c;安装最新的版本&#xff1a; pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly 第三种方法&#xff1a; git c…

[NLP]LLM--transformer模型的参数量

1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大规模语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&#xff1a;模型参数规模大&#xff0c;训练数据规模大。以GPT3为例&#xff0c;GPT3的参数量…

2023年8月23日博客更新

首发博客地址 https://blog.zysicyj.top/ 新增相册集和结婚相册 https://blog.zysicyj.top/gallery/ 相册整理不容易呀&#xff0c;后续有机会再慢慢整理吧&#xff0c;相册慢慢加上 我选择了大图展示&#xff0c;这种高清图片&#xff0c;我觉得还是大点的好&#xff0c;默认…

【广州华锐互动】牲畜养殖VR模拟实操系统为传统教育注入新的生命力

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐走进我们的生活。在农业领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为现代农业人才培养提供了新的途径。 由广州华锐互动开发的“牲畜养殖VR模拟实操系统”引起了广泛关注&#xff0c;系统包含了鸡、猪、牛、马…

蓝蓝设计-UI设计公司案例-HMI列车监控系统界面设计解决方案

2013年&#xff0c;为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今&#xff0c;为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式&#xff0c;重构框架设计、交互设计、…

借助frp的xtcp+danted代理打通两边局域网p2p方式访问

最终效果 实现C内网所有设备借助c1内网代理访问B内网所有服务器 配置公网服务端A frps 配置frps.ini [common] # 绑定frp穿透使用的端口 bind_port 7000 # 使用token认证 authentication_method token token xxxx./frps -c frps.ini启动 配置service自启(可选) /etc/…

密码学学习笔记(二十一):SHA-256与HMAC、NMAC、KMAC

SHA-256 SHA-2是广泛应用的哈希函数&#xff0c;并且有不同的版本&#xff0c;这篇博客主要介绍SHA-256。 SHA-256算法满足了哈希函数的三个安全属性&#xff1a; 抗第一原像性 - 无法根据哈希函数的输出恢复其对应的输入。抗第二原像性 - 给定一个输入和它的哈希值&#xf…

SQLite、MySQL、PostgreSQL3个关系数据库之间的对比

引言 关系数据模型以行和列的表格形式组织数据&#xff0c;在数据库管理工具中占主导地位。今天还有其他数据模型&#xff0c;包括NoSQL和NewSQL&#xff0c;但是关系数据库管理系统&#xff08;RDBMS&#xff09;仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最…

Cassandra初识

1、Cassandra支持宽列数据&#xff0c;mysql的话就需要分表了&#xff1b; 2、Cassandra支持命令行查看集群状态&#xff0c;直接输入cqlsh即可&#xff0c;然后可以select&#xff0c;可以create&#xff0c;可以alter&#xff1b; 3、Cassandra有个key space的概念&#xf…