Leetcode刷题笔记--Hot21-30

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.mfbz.cn/a/85737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[ MySQL ] — 如何理解索引以及索引的操作

目录 初识索引 认识磁盘 MySQL与存储 了解磁盘 mysql与磁盘的交互 索引的理解 理解单个Page 理解多个Page 页目录 单页情况 多页情况 索引结构 - B树 聚簇索引 和 非聚簇索引 索引操作 创建主键索引 唯一索引的创建 ​编辑 普通索引的创建 全文索引的创建 查询…

Ae 效果:CC Light Sweep

生成/CC Light Sweep Generate/CC Light Sweep CC Light Sweep&#xff08;CC 光线扫描&#xff09;可以创建一个动态的光线扫描&#xff0c;常用于模拟一束光在图像上移动的效果。支持 Alpha 通道并能基于 Alpha 通道边缘创造逼真的光照。 ◆ ◆ ◆ 效果属性说明 Center 中心…

Unity怎么制作魔法火焰特效?Unity制作魔法火焰特效方法

Unity制作魔法火焰特效方法&#xff1a; 在第一次玩Supergiant Games的RPG游戏《Hades》时&#xff0c;游戏的美术和视觉效果让人非常吃惊。受此启发&#xff0c;希望能够尝试制作类似风格的作品。 工作流程 整个工作从制作简单的火焰贴图开始。首先&#xff0c;我使用PhotoS…

深入了解Maven(一)

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 5.依赖的生命周期 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用…

html动态爱心代码【三】(附源码)

目录 前言 特效 内容修改 完整代码 总结 前言 七夕马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c;可直…

React前端开发架构:构建现代响应式用户界面

在当今的Web应用开发中&#xff0c;React已经成为最受欢迎的前端框架之一。它的出色性能、灵活性和组件化开发模式&#xff0c;使得它成为构建现代响应式用户界面的理想选择。在这篇文章中&#xff0c;我们将探讨React前端开发架构的核心概念和最佳实践&#xff0c;以帮助您构建…

使用 MATLAB 和 Simulink 对雷达系统进行建模和仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

正则表达式:贪婪与非贪婪模式

正则中的三种模式&#xff0c;贪婪匹配、非贪婪匹配和独占模式。 在这 6 种元字符中&#xff0c;我们可以用 {m,n} 来表示 &#xff08;*&#xff09;&#xff08;&#xff09;&#xff08;?&#xff09; 这 3 种元字符&#xff1a; 贪婪模式&#xff0c;简单说就是尽可能进行…

【golang】结构体及其方法的使用(struct)

函数是独立的程序实体。我们可以声明有名字的函数&#xff0c;也可以声明没名字的函数&#xff0c;还可以把它们当做普通的值传来传去。我们能把具有相同签名的函数抽象成独立的函数类型&#xff0c;以作为一组输入、输出&#xff08;或者说一类逻辑组件&#xff09;的代表。 …

【学会动态规划】摆动序列(27)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

Office ---- excel ---- 怎么批量设置行高

解决方法&#xff1a; 调整行高即可

使用Kind搭建本地k8s集群环境

目录 1.前提条件 2.安装Kind 3.使用Kind创建一个K8s集群 3.1.创建一个双节点集群&#xff08;一个Master节点&#xff0c;一个Worker节点&#xff09; 3.2.验证一下新创建的集群信息 3.3.删除刚刚新建的集群 4.安装集群客户端 4.1.安装kubectl 4.1.1.验证kubectl 4.2.安…

一文读懂设备管理系统:是什么、谁需要、怎样选

工业的迅猛发展让人类向前迈出了史无前例的步伐&#xff0c;工业4.0将我们又带入了一个信息化技术促进工业变革的新时代——智能化时代。一台台机器设备是工业发展史上必不可少的参与者&#xff0c;但企业对设备的管理存在种种痛点&#xff0c;比如生产设备多&#xff0c;但备件…

无涯教程-PHP - 简介

PHP 7是最期待的&#xff0c;它是PHP编程语言的主要功能版本。 PHP 7于2015年12月3日发布。本教程将以简单直观的方式教您PHP 7的新功能及其用法。 无涯教程假设您已经了解旧版本的PHP&#xff0c;现在就可以开始学习PHP 7的新功能。 使用下面的示例- <html><head&…

node安装node-sass依赖失败(版本不一致)

1.官网对应node版本 https://www.npmjs.com/package/node-sass2.node-sass版本对应表

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

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

使用Netplan建立Linux网络,简便的声明性方法

除了周围网络环境的复杂性之外&#xff0c;由于使用的技术堆栈和工具范围很广&#xff0c;Linux 网络可能会令人困惑。网桥、绑定、VRF 或路由的配置可以通过编程、声明、手动或自动化方式使用 ifupdown、ifupdown2、ifupdown-ng、iproute2、NetworkManager、systemd-networkd …

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复&#xff1f;数据丢失是一种让人非常头疼的问题&#xff0c;尤其是当我们的U盘数据丢失了&#xff0c;但内存仍然被占用时&#xff0c;更令人困惑和焦虑。然而&#xff0c;不要慌张&#xff01;在本文中&#xff0c;将为大家介绍一些有效的方法来恢…

Apache Hudi初探(二)(与flink的结合)--flink写hudi的操作(JobManager端的提交操作)

背景 在Apache Hudi初探(一)(与flink的结合)中&#xff0c;我们提到了Pipelines.hoodieStreamWrite 写hudi文件,这个操作真正写hudi是在Pipelines.hoodieStreamWrite方法下的transform(opName("stream_write", conf), TypeInformation.of(Object.class), operatorFa…

Vue的Ajax请求-axios、前后端分离练习

Vue的Ajax请求 axios简介 ​ Axios&#xff0c;是Web数据交互方式&#xff0c;是一个基于promise [5]的网络请求库&#xff0c;作用于node.js和浏览器中&#xff0c;它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块, 而在…
最新文章