leetcode hot 100 刷题记录(medium)

题目3:无重复字符的最长子串(YES)

  • 解题思路:其实最好想到的方法就是使用两层for,让每个字符都可以是子串的首字符,查看哪个子串的长度最长即可。

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。

class Solution {
public:int lengthOfLongestSubstring(string s) {//暴力的一次for,检查每个字符作为首字符时候的最长子串if(s.size()==0){return 0;}int max_ans=INT_MIN;for(int i=0;i<s.size();i++){unordered_map<int,int>map;int temp=0;for(int j=i;j<s.size();j++){//使用哈希表来检测是否重复map[s[j]]++;if(map[s[j]]>1){break;}temp++;if(temp>max_ans){max_ans=temp;}}}return max_ans;}
};

题目146:LRU缓存(YES)

  • 解题思路:使用双链表加上哈希表来实现,哈希表用来查看节点是否存在,双链表用来刷新优先级。这题需要非常关注。

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

//这题使用使用双链表+哈希表
//双链表是用来每次要刷新优先级的时候都将节点移动到表头
//哈希表是用来查看节点中是否存在key对应的节点struct DLinkList
{int key,value;DLinkList*prev;//前指针DLinkList*next;//后指针//无参构成//这个主要是为了构造虚拟头尾节点DLinkList():key(0),value(0),prev(nullptr),next(nullptr){}//有参构造DLinkList(int key,int value):key(key),value(value),prev(nullptr),next(nullptr){}
};class LRUCache {
private:int size;//当前节点的大小int capacity;//实际可存储的大小//虚拟头尾节点,主要是方便进行插入删除操作DLinkList*head;DLinkList*tail;//哈希表,用key来查找是否存在节点unordered_map<int,DLinkList*>map;public:LRUCache(int capacity) {this->size=0;this->capacity=capacity;//构造虚拟头尾节点head=new DLinkList();tail=new DLinkList();head->next=tail;tail->prev=head;}int get(int key) {//查看节点是否存在,且要刷新一次优先级if(!map.count(key)){//不存在return -1;}//存在,则刷新优先级,就是移动到表头//先取出节点DLinkList*node=map[key];moveTohead(node);return node->value;}void put(int key, int value) {//存放节点if(!map.count(key)){//不存在,新建一个节点DLinkList*node=new DLinkList(key,value);//插入到表头InsertToHead(node);size++;//存入哈希表中map[key]=node;//判断是否超出if(size>capacity){//要删除末尾的节点,也就是最久为使用的关键字DLinkList*temp = move_tail();//要从哈希表中删除这个节点map.erase(temp->key);//释放要删除的节点delete temp;size--;}}else{//存在,修改value//先取出节点DLinkList*node=map[key];node->value=value;//这个也要修改优先级moveTohead(node);}}void moveTohead(DLinkList*node){//将节点移动到表头,这是节点本来就有的//先删除这个节点node->prev->next=node->next;node->next->prev=node->prev;//将节点放入到表头//未了防止连接断掉,先处理后面的head->next->prev=node;node->next=head->next;head->next=node;node->prev=head;}void InsertToHead(DLinkList*node){//这个是刚刚申请的直接插入表头即可//先处理后面的head->next->prev=node;node->next=head->next;head->next=node;node->prev=head;}DLinkList*move_tail(){//删除末尾的节点DLinkList*temp=tail->prev;tail->prev=temp->prev;temp->prev->next=temp->next;return temp;}};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

题目215:数组中第K个最大元素(NO)

  • 解题思路:使用快速排序算法,切记快速排序算法是递归算法,递归终止条件不要忘。

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

class Solution {
public://快速排序算法void quick_sort(vector<int>&nums,int left,int right){//递归终止条件要有if(left>=right){return ;}//快速排序的思想就是每次都用中间节点最为排序中间的元素//比它大的放后面,比它小的放前面int mid=nums[(left+right)/2];//中间元素int i=left;int j=right;while(i<j){while(nums[i]<mid){i++;}while(nums[j]>mid){j--;}//找到了要交换的值if(i<=j){swap(nums[i],nums[j]);i++;j--;}}//检测左边if(i<right){quick_sort(nums,i,right);}if(j>left){quick_sort(nums,left,j);}}int findKthLargest(vector<int>& nums, int k) {//这题看似和简单表面上sort一下就解决了,但是这题考察的就是//排序算法的使用,我这题直接使用快排int len=nums.size();quick_sort(nums,0,len-1);return nums[len-k];}
};

题目15:三数之和(NO)

  • 解题思路:排序加双指针

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {//使用排序加上双指针sort(nums.begin(),nums.end());vector<vector<int>>ans;int len=nums.size();//每个节点都可以最为第一个节点for(int i=0;i<len-2;i++){//判断是否可前面的节点相同if(i>0&&nums[i]==nums[i-1]){//确保首元素不同continue;}//目标元素是当前的相反数int target=-nums[i];//查找后面的两个元素//使用while首尾开始查找int left=i+1;int right=len-1;while(left<right){int sum=nums[left]+nums[right];if(sum<target){//小了left++;}else if(sum>target){//大了right--;}else{//找到相加为零的三个数了vector<int>temp;temp.push_back(nums[i]);temp.push_back(nums[left]);temp.push_back(nums[right]);ans.push_back(temp);left++;right--;//查看元素是否不重复while (left < right && nums[left] == nums[left-1]) // 跳过重复元素++left;while (left < right && nums[right] == nums[right+1]) // 跳过重复元素--right;}}}return ans;}
};

题目53:最大子数组和(NO)

  • 动态规划,典型的人不为己,天诛地灭。

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组是数组中的一个连续部分。

class Solution {
public:int maxSubArray(vector<int>& nums) {int pre = 0, maxAns = nums[0];for (const auto &x: nums) {//原先的最大值可以当作前一个数//如果前面的值加上自己比自己小了,这显然拖累自己了果断抛弃//如果是自己拖累了前面的,那就不管了//典型的人不为己,天诛地灭。pre = max(pre + x, x);maxAns = max(maxAns, pre);}return maxAns;}
};

题目5:最长回文子串(NO)

  • 解题思路:暴力节,使用s.substr截取每个子串判断是否是回文数

给你一个字符串 s,找到 s 中最长的 回文子串。

class Solution {
public:string longestPalindrome(string s) {//暴力算法//截取出每个子串然后判断是否是回文数string res=s.substr(0,1);for(int i=0;i<s.size();i++){for(int j=i+1;j<s.size();j++){if(j-i+1>res.size()&&isPalindrome(s,i,j)){//substr是截取子串,i是首字符,j-i+1是长度res=s.substr(i,j-i+1);}}}return res;}bool isPalindrome(string &s,int left,int right){while(left<=right){if(s[left]!=s[right]){return false;}left++;right--;}return true;}
};

题目102:二叉树的层序遍历(YES)

  • 这算比较容易的中等难度题了,直接使用层序遍历,也就是广度优先遍历算法即可,关键是对队列的使用。

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root==nullptr){return ans;}//层序遍历queue<TreeNode*>que;que.push(root);while(!que.empty()){//处理当前层的int size=que.size();vector<int>ret;for(int i=0;i<size;i++){TreeNode*temp=que.front();que.pop();ret.push_back(temp->val);if(temp->left!=nullptr){que.push(temp->left);}if(temp->right!=nullptr){que.push(temp->right);}}ans.push_back(ret);}return ans;}
};

题目33:搜索旋转排序数组(YES)

  • 解题思路:以第一个结点为依据来判断是向上查找还是向下查找。

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

class Solution {
public:int search(vector<int>& nums, int target) {//这题的难度在于时间复杂度上的要求int len=nums.size();//我打算以第一个为基础进行查找if(nums[0]>target){//向下查找int i=len-1;while(nums[i]!=target){i--;if(i<0||nums[i]<target){return -1;}}return i;}else{//向上查找int i=0;while(nums[i]!=target){i++;if(i>=len||nums[i]>target){return -1;}}return i;}return -1;}
};

题目200:岛屿数量(NO)

  • 解题思路:广度优先遍历,设置访问数组这里很容易出错。

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

class Solution {
public:int numIslands(vector<vector<char>>& grid) {if (grid.empty() || grid[0].empty()) { // 如果网格为空,返回岛屿数量为0return 0;}int row = grid.size(); // 获取网格行数int col = grid[0].size(); // 获取网格列数int ans = 0; // 岛屿数量vector<vector<bool>> visited(row, vector<bool>(col, false)); // 二维visited数组用来记录已访问过的位置for (int i = 0; i < row; i++) { // 遍历网格行for (int j = 0; j < col; j++) { // 遍历网格列if (grid[i][j] == '1' && !visited[i][j]) { // 如果当前位置是陆地且未访问过ans++; // 岛屿数量加一queue<pair<int, int>> que; // 定义队列用于广度优先搜索que.push({i, j}); // 将当前陆地位置加入队列visited[i][j] = true; // 标记当前位置已访问while (!que.empty()) { // 开始广度优先搜索int current_x = que.front().first;int current_y = que.front().second;que.pop(); // 弹出当前位置int dx[4] = {-1, 1, 0, 0}; // 定义方向数组int dy[4] = {0, 0, -1, 1};for (int k = 0; k < 4; k++) { // 遍历四个方向int next_x = current_x + dx[k];int next_y = current_y + dy[k];if (next_x >= 0 && next_x < row && next_y >= 0 && next_y < col&& grid[next_x][next_y] == '1' && !visited[next_x][next_y]) { // 判断边界,未访问过,以及为陆地que.push({next_x, next_y});visited[next_x][next_y] = true; // 将相邻陆地加入队列并标记为已访问}}}}}}return ans; // 返回岛屿数量}
};

题目46:全排列(NO)

  • 解题思路:使用了回溯算法,核心的地方其实是递归算法的使用。

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

class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> res;vector<int> temp; // 用于临时存储排列的容器vector<int> visited(nums.size(), 0); // 记录每个数是否已经访问过的标志数组backtrack(nums, res, temp, visited);return res;}void backtrack(vector<int>& nums, vector<vector<int>>& res, vector<int>& temp, vector<int>& visited) {if (temp.size() == nums.size()) { // 如果临时排列的长度等于输入数组的长度,则将当前排列加入结果集res.push_back(temp);return;}for (int i = 0; i < nums.size(); ++i) {if (visited[i] == 0) { // 如果当前数字未被访问过visited[i] = 1; // 标记当前数字为已访问temp.push_back(nums[i]); // 将当前数字加入临时排列backtrack(nums, res, temp, visited); // 递归填充下一个位置temp.pop_back(); // 撤销操作,将当前数字移出临时排列visited[i] = 0; // 恢复当前数字为未访问状态,以便后续排列中再次使用}}}
};

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

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

相关文章

lightgbm

lightGBM 1.sklearn 使用代码 【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参 首先&#xff0c;XGBoost、LightGBM和CatBoost都是目前经典的SOTA&#xff08;state of the art&#xff09;Boosting算法&#xff0c;都可以归类到梯度提升决策树算法系列。三个模…

探索LangChain的单元测试世界:主流框架全解析

探索LangChain的单元测试世界&#xff1a;主流框架全解析 引言 在软件开发过程中&#xff0c;单元测试是确保代码质量的关键环节。LangChain作为一个多语言编程工具链&#xff0c;支持多种编程语言&#xff0c;每种语言都有其对应的单元测试框架。本文将详细介绍LangChain支持…

5. JavaSE ——【适合小白的数组练习题】

&#x1f4d6;开场白 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

【区块链 + 智慧政务】澳门:智慧城市建设之证书电子化项目 | FISCO BCOS应用案例

2019 年 2 月 27 日&#xff0c;澳门政府设立的澳门科学技术发展基金与微众银行达成合作&#xff0c;通过区块链、人工智能、大数据、 云计算等创新技术&#xff0c;共同推进澳门特区的智慧城市建设与未来型城市发展&#xff0c;提升粤港澳大湾区的科创能力。在澳 门智慧城市建…

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算&#xff0c;对区域进行离散化处理&#xff0c;采用隐式差分格式进行离散计算。隐式差分格式如图&#xff1a; 每层材料内部 对第 j j j层材料: 其中&#xff0c; λ j \lambda_j λj​表示第 j j j层的热扩散率&#xff0c; c j c_j cj​表示第 j j j层的比热容…

Matplotlib库学习之pyplot.figure()函数

Matplotlib库学习之pyplot.figure()函数 一、简介 pyplot.figure() 是 Matplotlib 的 pyplot 模块中的一个函数&#xff0c;用于创建一个新的图形&#xff08;figure&#xff09;。在 Matplotlib 中&#xff0c;图形是绘图元素的容器&#xff0c;可以包含多个坐标轴&#xff…

linux需要熟悉的命令理解记忆

(1)光标插入 (1)一般模式下: i 插入到光标前方 记忆方法:在一般模式下, 光标选中字符, 我们按下 i, 就会插入光标的前方, insert, 表示插队 (2)一般模式下: a 插入到光标后方 记忆方法: 在一般模式下, 光标选中字符,a表示append, 添加或者附加的意思 (3) 如果要在行首或者行…

css实现每个小盒子占32%,超出就换行

代码 <div class"visitors"><visitor class"item" v-for"(user,index) in userArr" :key"user.id" :user"user" :index"index"></visitor></div><style lang"scss" scoped&…

java乱码问题

文章目录 1.eclipse所有修改编码的地方2.io读取文件乱码问题1.读写统一2.转换字符编码&#xff1a; 3.http请求返回乱码 1.eclipse所有修改编码的地方 2.io读取文件乱码问题 1.读写统一 如果文件是以UTF-8编码保存的&#xff0c;那么在读取文件时也应使用UTF-8编码。 2.转换…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events &#xff08;专栏目录&#xff09; 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域&#xff0c;新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

百分点科技签约潍坊市数据产业发展战略合作

近日&#xff0c;潍坊市数据产业发展战略合作签约仪式举行&#xff0c;潍坊市人民政府副市长张震生&#xff0c;潍坊市财政局党组书记、局长王金祥&#xff0c;潍坊市大数据局党组书记陈强出席大会并致辞。百分点科技受邀进行战略合作签约&#xff0c;共同见证潍坊市数据要素市…

生成式人工智能(AI)的未来

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

深度学习模型快速开发平台推荐

前言 本文面向深度学习初学者或者工程师&#xff0c;推荐几个常用的深度学习模型快速开发平台。可以帮助初学者快速跑通模型&#xff0c;帮助工程师快速对模型进行部署和应用。 huggingface 简介 不多介绍&#xff0c;全球最大的模型托管平台&#xff0c;该平台最大的特点是…

全网超详细Redis主从部署(附出现bug原因)

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 http://t.csdnimg.cn/zkpBE http://t.csdnimg.cn/lUU5gLinux环境下配置redis 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redi…

C++——类和对象(初始化列表和运算符重载与静态与友元)

文章目录 初始化列表语法结构定义和使用案例初始化列表初始化常量成员&#xff1a; 注意事项 运算符重载加法运算符重载语法结构示例注意事项 减法运算符重载语法结构示例注意事项 等于运算符重载等于运算符 的重载语法示例注意事项 大于运算符重载大于运算符 > 的重载语法…

mac如何查看cpu和显卡温度

在Mac上查看CPU和显卡温度&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用内建工具“活动监视器” 虽然“活动监视器”不能直接显示温度信息&#xff0c;但它可以显示CPU使用情况等信息。 打开“活动监视器”&#xff0c;可以通过以下路径找到&#…

JavaScript 常见数学用法

JavaScript 数学 JavaScript Math 对象允许您对数字执行数学任务。 实例&#xff1a; Math.PI; 返回 3.141592653589793常见案例 Math.round() Math.round(x) 的返回值是 x 四舍五入为最接近的整数&#xff1a; 实例&#xff1a; Math.round(6.8); // 返回 7 Math.r…

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…

python初学之路

一、python入门&#xff1a; https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzI2NDU3NjIzMQ&actiongetalbum&album_id3244362729562406922&scene173&subscene&sessionidsvr_ca72c6eb974&enterid1721214755&from_msgid2247487445&from_itemi…

勘测院如何实现可控便捷的图纸安全外发?

勘测院&#xff0c;也称为勘测设计研究院或勘测设计院&#xff0c;是进行与地质、地形和地貌有关的勘察测量的单位&#xff0c;为各类工程项目提供准确的地质数据和设计依据。 勘测院会产生各类包括图纸在内的文件&#xff0c;如&#xff1a; 1、项目相关文件&#xff1a;项目…