【LeetCode算法系列题解】第46~50题

news2024/10/7 8:22:20

CONTENTS

    • LeetCode 46. 全排列(中等)
    • LeetCode 47. 全排列 II(中等)
    • LeetCode 48. 旋转图像(中等)
    • LeetCode 49. 字母异位词分组(中等)
    • LeetCode 50. Pow(x, n)(中等)

LeetCode 46. 全排列(中等)

【题目描述】

给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。

【示例1】

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

【示例2】

输入:nums = [0,1]
输出:[[0,1],[1,0]]

【示例3】

输入:nums = [1]
输出:[[1]]

【提示】

1 ≤ n u m s . l e n g t h ≤ 6 1\le nums.length\le 6 1nums.length6
− 10 ≤ n u m s [ i ] ≤ 10 -10\le nums[i]\le 10 10nums[i]10
nums 中的所有整数互不相同

【分析】


全排列的裸题,DFS 入门题,不需要过多讲解了,由于题目保证每个数互不相同,因此可以用一个整数的二进制中的每一位表示某个数是否已被使用,省去开标记数组的额外空间开销。

当然,用 next_permutation 函数也是可以秒杀的,不过面试肯定还是要会手搓~


【代码】

next_permutation 函数实现】

class Solution {
public:
    vector<vector<int>> res;

    vector<vector<int>> permute(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        do {
            res.push_back(nums);
        } while (next_permutation(nums.begin(), nums.end()));
        return res;
    }
};

【DFS 实现】

class Solution {
public:
    vector<vector<int>> res;
    vector<int> v;

    vector<vector<int>> permute(vector<int>& nums) {
        dfs(nums, 0, 0);
        return res;
    }

    void dfs(vector<int>& nums, int u, int state)  // state二进制的第i位表示i是否已被使用
    {
        if (u == nums.size()) { res.push_back(v); return; }
        for (int i = 0; i < nums.size(); i++)
            if (!(state >> nums[i] + 10 & 1))  // 判断state的第i位是否为1,注意将nums[i]映射成0~20
            {
                v.push_back(nums[i]);
                dfs(nums, u + 1, state | 1 << nums[i] + 10);
                v.pop_back();
            }
    }
};

LeetCode 47. 全排列 II(中等)

【题目描述】

给定一个可包含重复数字的序列 nums,按任意顺序返回所有不重复的全排列。

【示例1】

输入:nums = [1,1,2]
输出:[[1,1,2],[1,2,1],[2,1,1]]

【示例2】

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

【提示】

1 ≤ n u m s . l e n g t h ≤ 8 1\le nums.length\le 8 1nums.length8
− 10 ≤ n u m s [ i ] ≤ 10 -10\le nums[i]\le 10 10nums[i]10

【分析】


这一题和上一题的差别在于数字可能有重复,因此需要考虑如何控制搜索出来的序列不会重复。对于相同的数,我们应该规定他们的顺序,比如统一按升序排列或者降序排列,这样相同的数的排列就只会有一种对应关系。

如何实现这一操作呢?我们先对数组进行排序,我们要保证答案中相同数的相对位置和原始数组一样,因此我们在枚举每个数 nums[i] 的时候,如果 nums[i] == nums[i - 1],且 nums[i - 1] 还没有被使用,那么 nums[i] 也不能使用。我们在这题中使用 state 二进制的第 i i i 位表示 nums[i] 是否被使用。


【代码】

class Solution {
public:
    vector<vector<int>> res;
    vector<int> v;

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());  // 先排好序
        dfs(nums, 0, 0);
        return res;
    }

    void dfs(vector<int>& nums, int u, int state)
    {
        if (u == nums.size()) { res.push_back(v); return; }
        for (int i = 0; i < nums.size(); i++)
            // 如果当前数和前一个数相等但是前一个数没被用过那么当前数也不能用
            if (i && nums[i] == nums[i - 1] && !(state >> i - 1 & 1)) continue;
            else if (!(state >> i & 1))  // 判断第i个数是否被使用
            {
                v.push_back(nums[i]);
                dfs(nums, u + 1, state | 1 << i);
                v.pop_back();
            }
    }
};

LeetCode 48. 旋转图像(中等)

【题目描述】

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

【示例1】

在这里插入图片描述

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

【示例2】

在这里插入图片描述

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

【提示】

n = = m a t r i x . l e n g t h = = m a t r i x [ i ] . l e n g t h n == matrix.length == matrix[i].length n==matrix.length==matrix[i].length
1 ≤ n ≤ 20 1\le n\le 20 1n20
− 1000 ≤ m a t r i x [ i ] [ j ] ≤ 1000 -1000\le matrix[i][j]\le 1000 1000matrix[i][j]1000

【分析】


我们先给出一个变换过程的例子:

1 2 3      1 4 7      7 4 1
4 5 6  =>  2 5 8  =>  8 5 2
7 8 9      3 6 9      9 6 3

该过程很简单,但是没有接触过类似题目的话确实很难想出来,首先沿着主对角线进行翻转,然后沿着列的中轴进行翻转即可。


【代码】

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        // 沿对角线翻转
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j < n; j++)
                swap(matrix[i][j], matrix[j][i]);
        // 沿列中轴线翻转
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n >> 1; j++)
                swap(matrix[i][j], matrix[i][n - 1 - j]);
    }
};

LeetCode 49. 字母异位词分组(中等)

【题目描述】

给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的所有字母得到的一个新单词。

【示例1】

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

【示例2】

输入: strs = [""]
输出: [[""]]

【示例3】

输入: strs = ["a"]
输出: [["a"]]

【提示】

1 ≤ s t r s . l e n g t h ≤ 1 0 4 1\le strs.length\le 10^4 1strs.length104
0 ≤ s t r s [ i ] . l e n g t h ≤ 100 0\le strs[i].length\le 100 0strs[i].length100
strs[i] 仅包含小写字母

【分析】


我们可以将每个字符串按字典序排序,这样如果两个字符串所含的字符相同那么排序后的字符串一定也相同,然后我们再用一个哈希表记录每类字符串即可。


【代码】

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string, int> st;  // 记录每一类的下标
        int idx = 0;
        for (auto s: strs)
        {
            string t = s;
            sort(t.begin(), t.end());
            if (!st[t]) st[t] = ++idx, res.push_back(vector<string> { s });
            else res[st[t] - 1].push_back(s);  // 注意vector中下标从0开始
        }
        return res;
    }
};

LeetCode 50. Pow(x, n)(中等)

【题目描述】

实现 pow(x, n),即计算 x 的整数 n 次幂函数(即, x n x^n xn)。

【示例1】

输入:x = 2.00000, n = 10
输出:1024.00000

【示例2】

输入:x = 2.10000, n = 3
输出:9.26100

【示例3】

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

【提示】

− 100.0 < x < 100.0 -100.0 < x < 100.0 100.0<x<100.0
− 2 31 ≤ n ≤ 2 31 − 1 -2^{31}\le n\le 2^{31}-1 231n2311
n 是一个整数
要么 x 不为零,要么 n > 0
− 1 0 4 ≤ x n ≤ 1 0 4 -10^4\le x^n\le 10^4 104xn104

【分析】


快速幂裸题,统一将 n n n 转为非负数再求解,最后再根据 n n n 的正负修改结果即可( x − n = 1 x n x^{-n}=\frac {1}{x^n} xn=xn1)。注意如果 n n nINT_MIN 直接转换为正数会溢出,因此需要开 long long


【代码】

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1;
        for (long long k = abs((long long)n); k; k >>= 1)
        {
            if (k & 1) res *= x;
            x *= x;
        }
        if (n < 0) res = 1 / res;
        return res;
    }
};

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

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

相关文章

【高阶产品策略】设计有效的AB测试

文章目录 1、A/B测试概述2、A/B测试实施过程3、A/B测试中需要注意的地方4、从一个案例中看A/B测试 1、A/B测试概述 2、A/B测试实施过程 3、A/B测试中需要注意的地方 4、从一个案例中看A/B测试

水果库存系统(SSM+Thymeleaf版)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 文章目录 一、前言二、系统架构与需求分析1、技术栈1.1 后端1.2 前端 2、需求分析 三、设计…

python 深度学习 解决遇到的报错问题4

目录 一、DLL load failed while importing _imaging: 找不到指定的模块 二、Cartopy安装失败 三、simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 四、raise IndexError("single positional indexer is out-of-bounds") 五、T…

Linux系统Ubuntu以非root用户身份操作Docker的方法

本文介绍在Linux操作系统Ubuntu版本中&#xff0c;通过配置&#xff0c;实现以非root用户身份&#xff0c;进行Docker各项操作的具体方法。 在文章Linux系统Ubuntu配置Docker详细流程&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/132612560&#xff0…

一文1800字从0到1使用Python Flask实战构建Web应用

Python Flask是一个轻量级的Web框架&#xff0c;它简单易用、灵活性高&#xff0c;适用于构建各种规模的Web应用。本文将介绍如何使用Python Flask框架来实战构建一个简单的Web应用&#xff0c;并展示其基本功能和特性。 第一部分&#xff1a;搭建开发环境 在开始之前我们需要…

Redis常用命令,你了解哪些呢?

目录 前置工作&#xff1a;先进入Redis客户端 1、Redis最核心的两个命令&#xff1a;get & set set&#xff1a;存键值对 get&#xff1a;根据key&#xff0c;取出value 2、Redis全局命令 2.1、keys ---查询当前服务器上匹配的key 2.1.1. &#xff1f; 匹配任意一个字…

Python VScode 配置

在上一章节中我们已经安装了 Python 的环境&#xff0c;本章节我们将介绍 Python VScode 的配置。 准备工作&#xff1a; 安装 VS Code安装 VS Code Python 扩展安装 Python 3 安装 VS Code VSCode&#xff08;全称&#xff1a;Visual Studio Code&#xff09;是一款由微软…

关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿

题1&#xff1a;岛屿周长 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;gridi 1 表示陆地&#xff0c; gridi 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰…

龙迅LT9611 2PORT MIPIDSI/CSI转HDMI,带HDCP,支持分辨率高达4K30HZ

龙迅LT9611 1.描述&#xff1a; LT9611 MIPIDSI/CSI到HDMI1.4桥具有双端口MIPID-PHY接收器前端配置&#xff0c;每个端口有4个数 据通道&#xff0c;每个数据通道运行2Gbps&#xff0c;最大输入带宽为16Gbps。该桥提供了一个HDMI数据输出与可 选的S/PDIF或8通道I2S串行音频…

STM32F4XX/APM32F4XX USB OTA升级

近期在研究USB CDC协议&#xff0c;使用USB Virtual Port Com功能与上位机通讯做了OTA功能。开发平台&#xff1a;MDK529 开发硬件&#xff1a;APM32F411 首先看下手册Flash分布&#xff0c;Flash总共8个扇区。 接下来进行Flash分区。 扇区 0 和 扇区 1做Boo区。 扇区 2做APP跳…

C#面试十问

1&#xff1a;C#中变量类型分为哪两种&#xff1f;它们的区别是什么&#xff1f;2&#xff1a;Class和Struct的区别&#xff1f;3&#xff1a;C#中类的修饰符和类成员的修饰符有哪些&#xff1f;4&#xff1a;面向对象的三个特征&#xff08;特点&#xff09;是什么&#xff1f…

随机游走任务中时间差分(0)和常数α蒙特卡罗方法的比较

一、说明 在这篇文章中&#xff0c;我们讨论了常α MC 方法和 TD&#xff08;0&#xff09; 方法之间的区别&#xff0c;并比较了它们在随机游走任务中的性能。TD方法在本文的所有测试中都覆盖了MC方法&#xff0c;因此将TD视为强化学习任务的方法是更可取的选择。 二、方法库介…

算法通关村第10关【白银】| 数组中第k大的数

思路&#xff1a;快速排序&#xff0c;每次都定位一个元素&#xff0c;找指定位置的元素还得有序&#xff0c;很容易就想到快排思想 小优化之处就是当前归位元素比目标元素小就继续往右&#xff0c;比目标元素大就往左&#xff0c;相等就返回 class Solution {public int fin…

【算法竞赛宝典】稀疏数组

【算法竞赛宝典】稀疏数组 题目描述代码展示 题目描述 代码展示 random.cpp #include <iostream>using namespace std;int main() {freopen("zip5.in", "w", stdout);int n, m;cin >> n >> m;cout << n << << m <…

小白入门python

建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本&#xff0c;记得配置系统环境变量&#xff0c;python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器

4.1 链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

为什么磁盘满可能导致cpu使用率飙升

先说原因 因为当文件在安装和卸载的时候&#xff0c;会使硬盘中的数据排列非常分散或者断断续续的&#xff0c;让电脑在查找时速度变慢&#xff0c;就造成大量的使用CPU资源。这时就需要更换CPU。 案例 事件描述 公司监控系统事件报警某个应用的磁盘满了。通过后端执行命令发现…

linux编程--进程--进程相关概念

5个问题了解进程&#xff1a; 什么是程序&#xff0c;什么是进程&#xff0c;有什么区别如何查看系统中有哪些进程&#xff1f;什么是进程标识符&#xff1f;什么叫父进程&#xff0c;什么叫子进程&#xff1f;c程序的存储空间是如何分配的&#xff1f; 1.程序是静态的概念&a…

【力扣】96. 不同的二叉搜索树 <动态规划>

【力扣】96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&am…

算法竞赛备赛之数学知识训练提升,暑期集训营培训

1.质数 在大于1的整数&#xff0c;如果质包含1和本身这两个约数&#xff0c;就称之为素数/质数。 1.质数的判定&#xff08;试除法&#xff09; 优化后的&#xff1a; #include<iostream> #include<algorithm> ​ using namespace std; ​ bool is_prime(int n…