【LeetCode 热题 HOT 100】题解笔记 —— Day01

news2024/11/18 10:38:04

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

  • 一、两数之和
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 二、两数相加
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 三、无重复字符的最长子串
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 四、寻找两个正序数组的中位数
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 五、最长回文子串
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 六、正则表达式匹配
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 七、盛最多水的容器
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 八、三数之和
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 九、电话号码的字母组合
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 十、删除链表的倒数第 N 个结点
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现

一、两数之和

1. 题目描述

在这里插入图片描述


2. 思路分析

最容易想到的方法是枚举数组中的每一个数 x x x,寻找数组中是否存在 t a r g e t − x target - x targetx

使用哈希表,可以将寻找 t a r g e t − x target - x targetx 的时间复杂度降低到从 O ( N ) O(N) O(N) 降低到 O ( 1 ) O(1) O(1)

循环一遍nums数组,在每步循环中做两件事:
1、判断 target - nums[i] 是否出现在哈希表中;
2、将 nums[i] 插入到哈希表中。


3. 代码实现

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> heap;
        for (int i = 0; i < nums.size(); i ++) {
            int r = target - nums[i];
            if (heap.count(r)) return {heap[r], i};
            heap[nums[i]] = i;
        }
        return {};
    }
};

二、两数相加

1. 题目描述

在这里插入图片描述


2. 思路分析

(模拟人工加法) O(n)
这是一道模拟题,直接模拟列竖式做加法的过程:

  1. 从最低位至最高位,逐位相加,如果大于和等于10,则保留个位数字,同时向前一位加1;
  2. 如果最高位有进位,则需在最前面补1。

列表的题目,有个常见的技巧:
添加一个虚拟头结点:ListNode *head = new ListNode(-1);,这样可以简化边界情况的判断。

时间复杂度:由于总共共扫描一遍,所以时间复杂度是O(n)。


3. 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        auto dummy = new ListNode(-1), cur = dummy;
        int t = 0;
        while (l1 || l2 || t) {
            if (l1) t += l1->val, l1 = l1->next;
            if (l2) t += l2->val, l2 = l2->next;
            cur = cur->next = new ListNode(t % 10);
            t /= 10;
        }
        return dummy->next;
    }
};

三、无重复字符的最长子串

1. 题目描述

在这里插入图片描述


2. 思路分析

定义两个指针 i , j ( i < = j ) i,j(i <= j) i,j(i<=j), 表示当前扫描到的子串是 [ i , j ] [i,j] [i,j](闭区间)。扫描过程中维护一个哈希表unorderes_map<char, int> hash, 表示 [ i , j ] [i,j] [i,j] 中每个字符出现的个数。

线性扫描,每次循环的流程如下:

  1. 指针 j j j 向后移一位,同时将哈希表中 s [ j ] s[j] s[j] 的计数加一:hash[s[j]] ++;
  2. 假设 j j j 移动前的区间 [ i , j ] [i,j] [i,j] 中没有重复字符,则 j j j 移动后,只有 s [ j ] s[j] s[j] 可能出现2次。因此我们不断向后移动 i i i,直至区间 [ i , j ] [i,j] [i,j] s [ j ] s[j] s[j] 的个数等于1为止。

3. 代码实现

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> heap;
        int res = 0;
        for (int i = 0, j = 0; i < s.size(); i ++) {            
            heap[s[i]] ++;
            while (heap[s[i]] > 1) heap[s[j ++]] --;
            res = max(res, i - j + 1);
        }
        return res;
    }
};

四、寻找两个正序数组的中位数

1. 题目描述

在这里插入图片描述


2. 思路分析

3. 代码实现


五、最长回文子串

1. 题目描述

在这里插入图片描述


2. 思路分析

暴力枚举 O( 2 2 2^2 22)
首先枚举回文串的中心 i i i,然后分两种情况向两边扩展,直到遇到不同字符为止:

  • 回文串长度是奇数,则依次判断 s [ i − k ] = = s [ i + k ] , k = 1 , 2 , 3..... s[i - k] == s[i + k], k = 1, 2,3..... s[ik]==s[i+k],k=1,2,3.....
  • 回文串长度是偶数,则依次判断 s [ i + k ] = = s [ i + k − 1 ] , k = 1 , 2 , 3.... s[i + k] == s[i + k - 1], k = 1, 2, 3.... s[i+k]==s[i+k1],k=1,2,3....

如果遇到不同字符,则我们找到了以 i i i 为中心的回文字符串边界。


3. 代码实现

class Solution {
public:
    string longestPalindrome(string s) {
        string res;
        for (int i = 0; i < s.size(); i ++ ) {
            int l = i - 1, r = i + 1;
            while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
            if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);

            l = i, r = i + 1;
            while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
            if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);
        }
        return res;
    }
};

六、正则表达式匹配

1. 题目描述

在这里插入图片描述


2. 思路分析

3. 代码实现


七、盛最多水的容器

1. 题目描述

在这里插入图片描述


2. 思路分析

  1. 初始化: 双指针 i i i j j j分别指向水槽的左右两端;
  2. 循环收窄: 直至双指针相遇时跳出;
    1. 更新面积最大值 r e s res res
    2. 选定两板高度中的短板,向中间收窄一格;
  3. 返回值: 返回面积最大值 r e s res res 即可。

3. 代码实现

class Solution {
public:
    int maxArea(vector<int>& height) {
       int res = 0;
       for (int i = 0, j = height.size() - 1; i < j;) {
           res = max(res, min(height[i], height[j]) * (j - i));
           if (height[i] > height[j]) j --;
           else i ++; 
       } 
       return res;

    }
};

八、三数之和

1. 题目描述

在这里插入图片描述


2. 思路分析

双指针算法 O ( n 2 ) O(n^2) O(n2)

  1. 枚举每个数,先确定 n u m s [ i ] nums[i] nums[i],在排序后的情况下,通过双指针 j j j k k k 分别从左边 j = i + 1 j = i + 1 j=i+1 和右边 k = n − 1 k = n - 1 k=n1 往中间靠拢,找到 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] = = 0 nums[i] + nums[j] + nums[k] == 0 nums[i]+nums[j]+nums[k]==0 的所有符合条件的搭配;
  2. 判重处理:i > 0(i不是第一个数) && nums[i] == nums[i - 1],表示当前确定好的数与上一个一样,需要直接 o n t i n u e ontinue ontinue,同理,j && nums[j] == nums[j-1] 需要直接 c o n t i n u e continue continue;
  3. while(j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k -- //要找到满足最小的 k k k
    为什么 j < k − 1 j < k - 1 j<k1
    试探法,如果 k k k 的下一个数( k k k的左边的数)满足就用下一个数。

3. 代码实现

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i ++ ) {
            if (i && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1, k = nums.size() - 1; j < k; j ++ ) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k --;
                if (nums[i] + nums[j] + nums[k] == 0) {
                    res.push_back({nums[i], nums[j], nums[k]});
                }
            }
        }
        return res;
    }
};

九、电话号码的字母组合

1. 题目描述

在这里插入图片描述


2. 思路分析

  • 这是个排列组合问题,这个排列组合可以用树的形式表示出来;
  • 当给定了输入字符串,比如:“23”,那么整棵树就构建完成了,如下:
    在这里插入图片描述
  • 问题转化成了从根节点到空节点一共有多少条路径。

3. 代码实现

class Solution {
public:
    vector<string> ans;
    string strs[10] = {
        "", "", "abc", "def",
        "ghi", "jkl", "mno",
        "pqrs", "tuv", "wxyz",
    };

    vector<string> letterCombinations(string digits) {
        if (digits.empty()) return ans;
        dfs(digits, 0, "");
        return ans;
    }

    void dfs(string& digits, int u, string path) {
        if (u == digits.size()) ans.push_back(path);
        else {
            for (auto c : strs[digits[u] - '0']) 
                dfs(digits, u + 1, path + c);
        }
    }
};

十、删除链表的倒数第 N 个结点

1. 题目描述

在这里插入图片描述


2. 思路分析

(两次遍历) O ( L ) O(L) O(L)

  1. 第一次遍历求出链表的长度。
  2. 第二次遍历删掉指定结点。

3. 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto dummy = new ListNode(-1);
        dummy->next = head;

        int len = 0;
        for (auto p = dummy; p; p = p->next) len ++;

        auto p = dummy;
        for (int i = 0; i < len - n - 1; i ++) p = p->next;
        p->next = p->next->next;

        return dummy->next;
    }
};

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

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

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

相关文章

spring boot整合Jasypt实现配置加密

文章目录 目录 文章目录 前言 一、Jasypt是什么&#xff1f; 二、使用步骤 1.引入 2.测试使用 3.结果 总结 前言 一、Jasypt是什么&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#xff0c;提供了一种简单的加密解密方式&#xff0c…

【JVM系列】- 穿插·对象的实例化与直接内存

对象的实例化与直接内存 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录…

laravel实现发送邮件功能

Laravel提供了简单易用的邮件发送功能&#xff0c;使用SMTP、Mailgun、Sendmail等多种驱动程序&#xff0c;以及模板引擎将邮件内容进行渲染。 1.在项目目录.env配置email信息 MAIL_MAILERsmtp MAIL_HOSTsmtp.qq.com MAIL_PORT465 MAIL_FROM_ADDRESSuserqq.com MAIL_USERNAME…

二阶常系数非齐次线性方程

,是一个n次多项式。 &#xff08;1&#xff09; 设 是(1)的特解。 是一个待定多项式 求的一阶导数 (求导&#xff1a;一项不变&#xff0c;二项求导二项不变&#xff0c;一项求导) 求的二阶导数 将其代入方程一 不可能是零 公式(2) 第一种情况&#xff1a; 即不是特征方程的…

c语言:有关内存函数的模拟实现

memcpy函数&#xff1a; 功能&#xff1a; 复制任意类型的数据&#xff0c;存储到某一数组中。 代码模拟实现功能&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include <stdio.h> #include<assert.h> memcpy…

机器学习第14天:KNN近邻算法

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 介绍 实例 回归任务 缺点 实例 分类任务 如何选择最佳参数 结语 介绍 KNN算法的核心思想是&#xff1a;当我们要判断一个数据为哪一类时…

ZKP中的哈希函数

1. 引言 后续博客&#xff1a; 如何选择ZK-friendly 哈希函数&#xff1f; 当暴露在ZK空间中时&#xff0c;对于普通crypto工程师来说&#xff0c;通常只需很少的时间就可以偶然发现一些外来的哈希函数——很可能是Poseidon。本文&#xff0c;将介绍ZK中高效哈希函数的历史&…

怎么给数据库某个字段建立一个前缀索引

说明&#xff1a;SQL调优中重要的一个环节是建立索引&#xff0c;其中有一条是字段值过长字段应该建立前缀索引&#xff0c;即根据字段值的前几位建立索引&#xff0c;像数据库中的密码字段、UUID字段。 因为其随机性&#xff0c;其实根据前几位就可以锁定某一条记录了。前缀索…

css实现图片绕中心旋转,鼠标悬浮按钮炫酷展示

vue模板中代码 <div class"contentBox clearfix home"><div class"circle"><img class"in-circle" src"../../assets/img/in-circle.png" alt""><img class"out-circle" src"../../as…

python基于DETR(DEtection TRansformer)开发构建钢铁产业产品智能自动化检测识别系统

在前文中我们基于经典的YOLOv5开发构建了钢铁产业产品智能自动化检测识别系统&#xff0c;这里本文的主要目的是想要实践应用DETR这一端到端的检测模型来开发构建钢铁产业产品智能自动化检测识别系统。 DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检…

字符串转换成十进制整数

编程要求 输入一个以#结束的字符串&#xff0c;本题要求滤去所有的非十六进制字符&#xff08;不分大小写&#xff09;&#xff0c;组成一个新的表示十六进制数字的字符串&#xff0c;然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#xff0c;则…

vue2:组件中extends的使用

上一篇文章中我对mixin的使用进行了一个使用和测试,这里对extend进行一个使用,其实extend和mixin还是有区别的。 上一篇文章:vue2:mixin混入的使用-CSDN博客 不过也是看实际的业务场景,我们也可以使用extend完成和mixin几乎一摸一样的操作。 不废话,上代码 创建extendTest.…

MySQL表连接

文章目录 MySQL内外连接1.内连接2.外连接&#xff08;1&#xff09;左外连接&#xff08;2)右外连接 3.简单案例 MySQL内外连接 1.内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下…

vulnhub靶机Aragog-1.0.2

靶机下载&#xff1a;https://download.vulnhub.com/harrypotter/Aragog-1.0.2.ova 主机发现 目标133 端口扫描 端口服务扫描 漏洞扫描 去看web 就一个图片 直接目录扫描 有点东西一个一个看&#xff08;blog里面有东西&#xff09; 这里面直接能看到wordpress 直接用wpscan…

Go 语言之 Maps 详解:创建、遍历、操作和注意事项

Maps用于以键值对的形式存储数据值。Maps中的每个元素都是一个键值对。Maps是一个无序且可更改的集合&#xff0c;不允许重复。Maps的长度是其元素的数量。您可以使用 len() 函数来查找长度。Maps的默认值是 nil。Maps保存对底层哈希表的引用。 Go语言有多种方法来创建Maps。 …

VS中如何使用Halcon

使用Halcon的本质就是调用Halcon的库&#xff0c;其主要步骤有&#xff1a; 1、将Halcon代码导出为C的.cpp文件 2、获取.cpp文件中的action函数的函数体 3、添加Halcon的动态库和静态库 4、添加action函数需要的头文件 导出halcon中的代码 a&#xff09;导出代码 b&#x…

运行软件报错找不到vcruntime140_1.dll无法继续执行代码如何解决?-常见问题

关于vcruntime140_1.dll丢失的6个解决方法。在我们使用电脑的过程中&#xff0c;有时候会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140_1.dll丢失”。那么&#xff0c;究竟什么是vcruntime140_1.dll文件呢&#xff1f;又是什么原因导致了它的丢失&#xff1f;接下来…

基于uniapp+vue微信小程序的健康饮食管理系统 907m6

设计这个微信小程序系统能使用户实现不需出门就可以在手机或电脑前进行网上查询美食信息、 运动视频等功能。 本系统由用户和管理员两大模块组成。用户界面显示在应用程序中&#xff0c;管理员界面显示在后台服务中&#xff0c;通过小程序端与服务端间进行数据交互与数据传输实…

微服务实战系列之Nginx(技巧篇)

前言 今天北京早晨竟然飘了一些“雪花”&#xff0c;定睛一看&#xff0c;似雪非雪&#xff0c;像泡沫球一样&#xff0c;原来那叫“霰”。 自然中&#xff0c;雨雪霜露雾&#xff0c;因为出场太频繁&#xff0c;认识门槛较低&#xff0c;自然不费吹灰之力&#xff0c;即可享受…

电脑技巧:电脑常见蓝屏、上不了网等故障及解决办法

目录 一、电脑蓝屏 常见原因1: 病毒木马 常见原因2: 安装了不兼容的软件 二、电脑不能上网 常见原因1: 新装系统无驱动 常见原因2: DNS服务器异常 常见原因3: 硬件问题 三、电脑没声音 常见原因1: 未安装驱动 常见原因2: 硬件故障 四、电脑屏幕不显示 常见原因1: 显…