Leetcode刷题笔记--Hot01-10

news/2024/5/9 14:09:31/文章来源:https://blog.csdn.net/weixin_43863869/article/details/130960174

1--两数之和

讲解参考:LeetCode 最热门 100 题

主要思路:

        对数组进行从小到大的排序,使用两个指针指向第一个元素和最后一个元素,即左指针指向第一个元素A[l],右指针指向最后一个元素A[R];

        判断两个指针当前指向值的和,若 A[l] + A[R] == Target,则返回;

        若 A[l] + A[R] < Target,表明和较小,需要左指针右移,即 l++;

        若 A[l] + A[R] > Target,表明和较大,需要右指针左移,即 r--;

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();std::vector<int> idx;for(int i = 0; i < n; i++) idx.push_back(i);// 通过排序数组 idx 间接排序 numssort(idx.begin(), idx.end(), [idx, nums](int i, int j){return nums[idx[i]] < nums[idx[j]];});std::vector<int> rec;for(int l = 0, r = n - 1; l < n; ){if(nums[idx[l]] + nums[idx[r]] == target){rec.push_back(idx[l]);rec.push_back(idx[r]);break;}else if(nums[idx[l]] + nums[idx[r]] < target){l++;}else{r--;}}return rec;}
};

2--两数相加

主要思路:

        按位相加,用一个 carry 变量记录进位值,用一个 sum 变量记录加和值,不断遍历相加直到链表为空;

        新建一个链表记录每个节点的加和值;

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * H = new ListNode(); // 新建链表存储计算结果ListNode * ptr = H; // 当前指针int carry = 0; // 进位值初始化为0while(l1 || l2 || carry){ // 链表不为空且进位值不为0int sum = 0;if(l1){sum += l1->val;l1 = l1->next; }if(l2){sum += l2->val;l2 = l2->next;}sum += carry; // 累计上一轮的进位值 carry = sum / 10; // 更新进位值ListNode *node = new ListNode(); // 新建节点存储加和node->val = sum % 10;ptr->next = node; ptr = ptr->next;}return H->next; // 返回不带头结点的链表}
};

3--无重复字符的最长子串

 主要思路:

        基于滑动窗口和哈希表,用一个滑动窗口遍历字符串的字符,确保滑动窗口内的所有字符都是不重复的,当滑动字符不断扩大遇到重复字符时,将左指针右移,直到没有重复字符,这时比较滑动窗口的长度和最大长度的值,更新最大长度;

        用哈希表记录滑动窗口内一个字符出现的次数,当新字符进入时,新字符对应的出现次数加1,当滑动窗口离开字符时,字符对应的出现次数减1;

class Solution {
public:int lengthOfLongestSubstring(string s) {int len = s.length(); // 字符串的长度 int l = 0; // 滑动窗口的左指针std::unordered_map<char, int> count; // 记录当前滑动窗口 char 字符对应的个数(出现的次数)int max_len = 0; // 返回的最大长度for(int r = 0; r < len; r++){ // r表示滑动窗口的右指针count[s[r]]++; // s[r]字符对应的数目加1while(count[s[r]] > 1){ // 滑动窗口内出现重复字符count[s[l]]--; // 左指针准备右移,先将当前左指针对应的字符数量减1l++; // 左指针右移}max_len = std::max(max_len, r - l + 1);}return max_len;}
};

4--寻找两个正序数组的中位数

主要思路:二分递归,视频讲解参考

#include <vector>
#include <iostream>class Solution {
public:int findKth(std::vector<int>& nums1, int sta, std::vector<int>& nums2, int stb, int kth){// 起始位置超出数组长度,直接返回另外一个数组的位置if (sta >= nums1.size()) return nums2[stb + kth - 1];if (stb >= nums2.size()) return nums1[sta + kth - 1];if (kth == 1) return std::min(nums1[sta], nums2[stb]); // 递归到 k = 1int h = kth / 2;int vala = nums1.size() - sta >= h? nums1[sta + h - 1] : nums1.back();int counta = nums1.size() - sta >= h ? h : nums1.size() - sta;int valb = nums2.size() - stb >= h? nums2[stb + h - 1] : nums2.back();int countb = nums2.size() - stb >= h ? h : nums2.size() - stb;if(vala <= valb){return findKth(nums1, sta + counta, nums2, stb, kth - counta);}return findKth(nums1, sta, nums2, stb + countb, kth - countb);}double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) {int n = nums1.size();int m = nums2.size();int t = n + m; // 总长度// 无论是奇数还是偶数,中位数都是以下索引(奇数的 id0 和 id1 相同)int id0 = (t + 1) / 2; int id1 = (t + 2) / 2;int val0 = findKth(nums1, 0, nums2, 0, id0); // 寻找第 id0 位对应的数值,第1次左起点从0开始int val1 = findKth(nums1, 0, nums2, 0, id1); // 寻找第 id1 位对应的数值,第1次左起点从0开始return (val0 + val1) / 2.0;}
};int main(int argc, char *argv[]){std::vector<int> nums1 = {1, 2};std::vector<int> nums2 = {3, 4};Solution s1;float middle = s1.findMedianSortedArrays(nums1, nums2);std::cout << "middle is: " << middle << std::endl;
}

主要思路:利用归并排序,将两个数组合并为一个有序的数组,最后返回其中位数;

#include <vector>
#include <iostream>class Solution {
public:void Merge_sort(std::vector<int> &nums1, std::vector<int> &nums2, std::vector<int> &nums){int i = 0, j = 0;while(i < nums1.size() && j < nums2.size()){if(nums1[i] <= nums2[j]){nums.push_back(nums1[i]);i++;}else{nums.push_back(nums2[j]);j++;}}if(i >= nums1.size()){while(j < nums2.size()){nums.push_back(nums2[j]);j++;}}if(j >= nums2.size()){while(i < nums1.size()){nums.push_back(nums1[i]);i++;}}}double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) {int n = nums1.size();int m = nums2.size();int l = n + m;Merge_sort(nums1, nums2, nums);int v0 = nums[(l+1) / 2 - 1];int v1 = nums[(l+2) / 2 - 1];return (v0+v1) / 2.0;}private:std::vector<int> nums;
};int main(int argc, char *argv[]){std::vector<int> nums1 = {1, 2};std::vector<int> nums2 = {3, 4};Solution s1;float middle = s1.findMedianSortedArrays(nums1, nums2);std::cout << "middle is: " << middle << std::endl;
}

5--最长回文子串

主要思路:

        遍历字符串的每个字符,用两个指针 l 和 r 分别指向其左字符和右字符,判断左字符和右字符是否相等,不断贪心向外扩展;

        需要注意区分奇数回文子串和偶数回文子串,奇数回文子串首次传入的左指针和右指针相同,都指向当前字符;

#include <string>
#include <iostream>class Solution {
public:void search(int l, int r, std::string s){int len = s.length();while(l >= 0 && r < len && s[l] == s[r]){l--;r++;}if((r - l - 1) > max){max = r - l - 1;start = l + 1;} }std::string longestPalindrome(std::string s) {for(int i = 0; i < s.length(); i++){search(i, i, s);// 奇数回文子串search(i, i+1, s); // 偶数回文子串}return s.substr(start, max);}
private:int max = 1;int start = 0;
};int main(int argc, char *argv[]){std::string s = "cbbd";Solution s1;std::string ret = s1.longestPalindrome(s);std::cout << ret << std::endl; 
}

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

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

相关文章

chatgpt赋能python:Python安装gym:入门指南

Python安装gym: 入门指南 如果您是一位正在学习强化学习的学生&#xff0c;或者是一位研究者、开发人员&#xff0c;那么您一定会对OpenAI出品的gym库感兴趣。该库为编写和比较强化学习算法提供了一组标准环境。但是&#xff0c;在使用gym之前&#xff0c;您需要将其安装到您的…

聊聊那些奇葩的代码规范 —— 所有 IntelliJ 的警告必须要处理

因为有些要求感觉实是太过奇葩&#xff0c;收集下来娱乐下大家。 代码规范要求 如果代码在 IntelliJ 出现了警告提示&#xff0c;所有的警告必须要在提交之前处理完成&#xff0c;否则 PR 合并全部被拒绝&#xff0c;不管有些警告是不是有点奇葩&#xff0c; 同时&#xff0…

智能路由器开发之创建一个procd init脚本示例

智能路由器开发之创建一个procd init脚本示例 Procd init脚本默认提供了许多好用的功能&#xff0c;例如重启策略和能够从UCI系统中存储和读取配置。 设置 举个例子&#xff0c;假设我们想创建一个作为服务的Shell脚本&#xff0c;并且这个服务可以通过消息和超时时间进行配…

chatgpt赋能python:Python定义未知变量的方法及注意事项

Python定义未知变量的方法及注意事项 在Python编程中&#xff0c;我们经常需要定义变量来存储数据&#xff0c;但有时候我们需要先创建一个变量&#xff0c;但不想立即给它赋值&#xff0c;或者我们想定义一个未知变量。本文将介绍Python中定义未知变量的方法及注意事项。 什…

chatgpt赋能python:Python安装和打开教程

Python安装和打开教程 Python作为一种高效、灵活、易学易用的编程语言&#xff0c;越来越受到广大程序员的青睐&#xff0c;越来越多的人想要学习Python。在学习Python之前&#xff0c;首先要进行Python的安装和打开。那么&#xff0c;本篇文章将为您介绍如何安装和打开Python…

READ-自动驾驶大场景神经渲染

这是一个针对自动驾驶场景的神经渲染方案&#xff0c;提出了一种大规模神经渲染方法来合成自动驾驶场景&#xff08;READ&#xff09;&#xff0c;这使得通过各种采样方案在PC上合成大规模驾驶场景成为可能。 疑问&#xff1a;文中提到基于nerf的方法和神经渲染方法&#xff0…

BOOST 恒压控制驱动芯片,外围电路简单

应用说明 Hi8000 是一款外围电路简单的 BOOST 升压恒压控制驱动芯片&#xff0c;适用于 2.7-40V 输入电压范围的升压恒压电源应用领域&#xff0c;启动电压可以低至 2.5V&#xff0c;可以广泛应用 于太阳能、便携式数码产品&#xff0c;锂电升压应用等供电领域。 应用领域 移…

第六十七天学习记录:对陈正冲编著《C 语言深度解剖》中关于变量命名规则的学习

最近开始在阅读陈正冲编著的《C 语言深度解剖》&#xff0c;还没读到十分之一就感觉收获颇多。其中印象比较深刻的是其中的变量的命名规则。 里面提到的不允许使用拼音正是我有时候会犯的错。 因为在以往的工作中&#xff0c;偶尔会遇到时间紧迫的情况。 而对于新增加的变量不知…

无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

无条件抽奖功能概述 允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置&#xff0c;完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。支持自定义设置中奖用户信息采集字段。支持设置预设中奖用户。支持设置定时开奖可查看…

java设计模式(十六)命令模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 命令模式&#xff08;Command Pattern&#xff09; 又叫动作模式或事务模式。指的是将一个请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开&#xff0c;然后可以使用不同的请求把客户端参数化&a…

【SpinalHDL快速入门】4.6、复合类型之Vec

文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、杂项&#xff08;Misc&#xff09;1.3.4、Lib辅助函数&#xff08;Lib helper functions&#xff09; 1.1、描述 …

2023/6/6总结

CSS 如果想要实现背景颜色渐变效果&#xff1a; left是从左边开始&#xff0c;如果想要对角线比如&#xff0c;左上角就是left top&#xff0c;渐变效果始终是沿着一条线来实现的。 下面是跟着视频教学用flex布局写的一个移动端网页&#xff1a; html代码&#xff1a; <!…

Day_42哈希表

目录 一. 关于哈希表 二. 如何实现哈希表 1. 散列函数 2. 散列表 3. 散列函数的构造方法 4. 处理冲突的方法 三. 代码实现 1. 构造函数构造哈希表 2. 哈希表的查找 四. 代码展示 五. 数据测试​编辑 六. 总结 一. 关于哈希表 在前面介绍的线性表的查找中,记录在表中的位置…

kali 2023.2安装、换源、更新、SSH

kali2023版本已经更新了&#xff0c;为了体验新版&#xff0c;下载试用了一下。记录初始的安装过程&#xff0c;以备复习用&#xff0c;不足之处欢迎批评指正。 一、下载 1、官网下载&#xff0c;地址&#xff1a;https://www.kali.org/&#xff0c;因为我准备在VM虚拟机中使用…

二叉搜索树(Binary Seach Tree)模拟实现

目录 二叉搜索树的性质 二叉搜索树的实现 结点类 接口类(BSTree) 二叉搜索树的插入(insert) 二叉搜索树的查找(find) 二叉搜索树删除(erase) 第二种、删除的结点右子树为空 第三种、删除的结点左子树为空 第四种、删除的结点左右都不为空 实现 二叉搜索树模拟实现代…

【算法】手写题

文章目录 画一个三角形实现三栏布局通过position和margin通过float和margin通过flex实现 变量提升题实现边框0.5px深拷贝快速排序 画一个三角形 .box1 {width: 0;height: 0;border: 10px solid;border-color: red transparent transparent transparent;}实现三栏布局 三栏布局…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…

呈现视觉妙技:使用Python将MP4视频转化为迷人的GIF图像

前言 GIF图片对于我来说是一个很好的展示方式&#xff0c;GIF 图片能够展示动态的图像效果&#xff0c;对于展示计算机视觉算法或结果非常有用。例如&#xff0c;我可以使用 GIF 图片来展示运动跟踪、姿势识别、图像分割、目标检测等任务的结果&#xff0c;以更生动和直观的方…

20230606夏新(Amoi)的4K显示器D320B2000的亮点检测

20230606夏新&#xff08;Amoi&#xff09;的4K显示器D320B2000的亮点检测 2023/6/7 0:14 https://item.jd.com/63690000655.html 夏新&#xff08;Amoi&#xff09;电脑显示器高清家用办公电竞吃鸡游戏液晶监控直播大屏便携显示屏幕 32英寸【直面 4k/144hz双模式 全面屏】黑 …

总结891

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲1遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化1讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff…