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

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.rhkb.cn/news/119488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云云服务器评测 | 从零开始:云耀云服务器L实例的全面使用解析指南

文章目录 一、前言二、云耀云服务器L实例要点介绍2.1 什么是云耀云服务器L实例2.2 云耀云服务器L实例的产品定位2.3 云耀云服务器L实例优势2.4 云耀云服务器L实例支持的镜像与应用场景2.5 云耀云服务器L实例与弹性云服务器&#xff08;ECS&#xff09;区别 三、购买与配置云耀云…

【100天精通Python】Day51:Python 数据分析_数据分析入门基础与Anaconda 环境搭建

目录 1 科学计算和数据分析概述 2. 数据收集和准备 2.1 数据收集 2.1.1 文件导入&#xff1a; 2.1.2 数据库连接&#xff1a; 2.1.3 API请求&#xff1a; 2.1.4 网络爬虫&#xff1a; 2.2 数据清洗 2.2.1 处理缺失值&#xff1a; 2.2.2 去除重复值&#xff1a; 2.2…

dlopen “libnvcuvid.so“ failed!

在使用NVIDIA DALI库进行视频数据处理时&#xff0c;出现了以上打开libnvcuvid.so动态库错误的问题&#xff0c;如下图所示&#xff1a; libnvcuvid.so是使用CUDA进行硬编解码需要的一个库&#xff0c;使用NVIDIA DALI进行视频处理时会依赖它。 本人是在Docker容器中运行的程序…

langchain介绍之-Prompt

LangChain 是一个基于语言模型开发应用程序的框架。它使得应用程序具备以下特点&#xff1a;1.数据感知&#xff1a;将语言模型与其他数据源连接起来。2.代理性&#xff1a;允许语言模型与其环境进行交互 LangChain 的主要价值在于&#xff1a;组件&#xff1a;用于处理语言模型…

[华为云云服务器评测] Unbutnu添加SSH Key、编译启动Springboot项目

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 第二章 [linux实战] Unbutnu添加SSH Key、启动Springboot项目 文章目录 系列文章目录前言一、任务拆解二、配置git,添加SSH Key2.1、登录远程主机2.2、配置git用户名和邮箱2.3、生成SSH key2.4、查…

【DevOps视频笔记】6 - 7. Jenkins 介绍 和 安装

一、Integrate 工具 二、Jenkins 介绍 1. Jenkins 最主要的工作 2. CI / CD 可以理解为&#xff1a; 2.1 CI 过程 2.2 CD 过程 三、Jenkins 安装 1. 安装准备工作 2. 安装 Jenkins Stage 1&#xff1a;拉取 jenkins 镜像 Stage 2&#xff1a;编写docker-compose.yml St…

小白开始学习C++

第一节&#xff1a;控制台输出hello word&#xff01; #include<iostream> //引入库文件 int main() { //控制台输出 hello word! 之后回车 std::cout << "hello word!\n"; #include<iostream> //引入库文件int main() {//控制台输出…

docker 笔记6:高级篇 DockerFile解析

目录 1.是什么&#xff1f; 2.构建三步骤 3.DockerFile构建过程解析 3.1 Dockerfile内容基础知识 3.2Docker执行Dockerfile的大致流程 总结 4.DockerFile常用保留字指令 5.案例&#xff1a;自定义镜像 5.1 要求&#xff1a; Centos7镜像具备vimifconfigjdk8 5.2编写 5…

Android 1.2.1 使用Eclipse + ADT + SDK开发Android APP

1.2.1 使用Eclipse ADT SDK开发Android APP 1.前言 这里我们有两条路可以选&#xff0c;直接使用封装好的用于开发Android的ADT Bundle&#xff0c;或者自己进行配置 因为谷歌已经放弃了ADT的更新&#xff0c;官网上也取消的下载链接&#xff0c;这里提供谷歌放弃更新前最新…

第12节——生命周期

一、概念 生命周期指 React 组件从装载至卸载的全过程&#xff0c;这个过程内置多个函数供开发者在组件的不同阶段执行需要的逻辑。 状态组件主要通过 3 个生命周期阶段来管理&#xff0c;分别是 挂载阶段&#xff08;MOUNTING&#xff09;&#xff0c;更新阶段&#xff08;U…

TIA博途从V15.1版本升级到V16后,下载配方时出错,动作异常终止

TIA博途从V15.1版本升级到V16后,下载配方时出错,动作异常终止 1. 读取配方的时候没有问题,完全正常,没有任何错误提示。 2. 但是在下载的时候,就提示了“出错。动作异常终止” 根据以往的经验分析,有可能是配方变量里面没有相对应的地址时候下载会出错,但是配方画面相对…

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…

基于Java+SpringBoot+Vue前后端分离大学生智能消费记账系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

国产10米分辨率的卫星介绍、下载和处理教程

10米分辨率的资源卫星介绍、下载和处理教程 简介 说起免费的10米分辨率卫星影像,大家首先想到的是sentinel卫星。但其实还有我国的中巴地球资源卫星04星(CBERS04)。 中巴地球资源卫星(China Brazil Earth Resources Satellite, CBERS)是中国和巴西共同投资、联合研制的地球…

PCIe DL_Feature详解

DL_Feature的引入 Data Link Control and Management State Machine在PCIe Gen4引入了DL_Feature这个状态&#xff0c;该状态主要用来协商PCIe link 两端是否支持新的DL Feature&#xff0c;目前为止DL Feature只引入了Scaled Flow Control 来提高Gen4及以上的效率。   DL_Fe…

qt信号与槽

输入账户密码成功则跳转界面 widget.cpp #include "widget.h" //自己的头文件Widget::Widget(QWidget *parent) //构造函数的定义: QWidget(parent) …

自建音乐服务器Navidrome之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…

纽扣电池/锂电池UN38.3安全检测报告

根据规章要求&#xff0c;航空公司和机场货物收运部门应对锂电池进行运输文件审查&#xff0c;重要的是每种型号的锂电池UN38.3安全检测报告。该报告可由的三方检测机构。如不能提供此项检测报告&#xff0c;将禁止锂电池进行航空运输. UN38.3包含产品&#xff1a;1、 锂电池2…

Typora导出的PDF目录标题自动加编号

Typora导出的PDF目录标题自动加编号 在Typora主题文件夹增加如下文件后&#xff0c;标题便自动加上了编号&#xff1a; https://gitcode.net/as604049322/blog_data/-/blob/master/base.user.css 例如&#xff1a; 但是导出的PDF中&#xff0c;目录却没有编号&#xff1a; 这…

qt day 5

1>实现闹钟功能 ---------------------------------------------------------------------- .pro ---------------------------------------------------------------------- QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# T…