Leetcode刷题笔记--Hot01-10

news2024/11/23 20:05:21

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 间接排序 nums
        sort(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; // 进位值初始化为0
        while(l1 || l2 || carry){ // 链表不为空且进位值不为0
            int 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]字符对应的数目加1
            while(count[s[r]] > 1){ // 滑动窗口内出现重复字符
                count[s[l]]--; // 左指针准备右移,先将当前左指针对应的字符数量减1
                l++; // 左指针右移
            }
            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 = 1

        int 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.coloradmin.cn/o/617825.html

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

相关文章

Threejs进阶之十七:Threejs中的Path、Shape和ShapeGeometry类

在实际的应用中&#xff0c;有时候需要我们根据一个二维图形拉伸为三维图形的情况&#xff0c;这就需要我们对Threejs中提供的二维图形相关的类有一个深入的了解&#xff0c;这一节我们就深入的聊一聊Threejs中的Path、Shape和ShapeGeometry类 目录 Path类构造函数常用属性常用…

chatgpt赋能python:Python字符串跨行:如何在代码中处理长字符串

Python字符串跨行&#xff1a;如何在代码中处理长字符串 当你编写Python代码时&#xff0c;可能会遇到需要编写很长的字符串的情况。例如&#xff0c;你可能需要将一大段文本或HTML代码嵌入到Python程序中。在这种情况下&#xff0c;你需要学会如何将长字符串跨行编写&#xf…

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ?

[chatGPT攻略] 如何检测文本内容是否由ChatGPT生成 ? 在 ChatGPT 爆火的两个月内&#xff0c;学生就已经自发用这种工具做作业、写论文偷懒&#xff0c;编剧会用它编故事试试出乎人意料的故事走向&#xff0c;文案编辑用它来给自己打工。 在用工具给自己省事这件事上&#xf…

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

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

论文翻译——Test Selection for Deep Learning Systems

文章目录 AbstractIntroductionRelated work&#xff08;这部分没有翻译完全&#xff0c;我主要是用来做课程回报的&#xff0c;后面的实验就够讲了&#xff0c;这里就不讲了&#xff09;3 Motivation and Problem Definition4 Test Selection MetricsMetrics Derived from the…

C++与Qt深度融合:高效设计多线程应用框架

C与Qt深度融合&#xff1a;高效设计多线程应用框架 1. C与Qt线程的混合使用1.1 C线程与Qt线程的基本概念1.2 线程间的相互依赖关系1.3 设计合理的代码框架 二、深入理解C和Qt线程模型2.1 C线程模型2.2 Qt线程模型2.3 C和Qt线程模型的比较 三、C和Qt线程间的互操作性3.1 std::th…

chatgpt赋能python:Python如何获取微信聊天记录

Python如何获取微信聊天记录 作为世界上最受欢迎的即时通讯工具之一&#xff0c;微信被大量用户使用。然而&#xff0c;微信聊天记录的备份和管理是一个重要的问题&#xff0c;特别是对于那些需要在工作和个人生活中快速查找重要信息的人来说。 幸运的是&#xff0c;Python编…

Cloud篇——GateWay 网关

1、GateWay是什么 官网讲解&#xff1a; SpringCloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;基于 Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 SpringCloud Gate…

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

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

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

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

chatgpt赋能python:Python如何抓取数据

Python如何抓取数据 介绍 Python是一种功能强大的编程语言&#xff0c;它被广泛使用于网络抓取和数据分析。无论您是想要从网站上抓取数据&#xff0c;还是使用API抓取数据&#xff0c;Python都是一种非常适合的工具。在本文中&#xff0c;我们将介绍Python如何抓取数据&…

WINDOWS权限维持

Meterpreter权限维持 meterpreter中的权限维持技术有两种&#xff1a; persistence&#xff08;注册表后门&#xff09;metsvc的后门&#xff08;服务后门&#xff09; 1、注册表后门 windows/local/persistence 这个方法是执行vbs脚本&#xff0c;这里很容易被杀软拦截&a…

Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析…

MySQL数据库 12:约束

约束&#xff1a; 在MySQL中&#xff0c;约束是一种限制数据表中列值的规定。保证数据库中的数据正确&#xff0c;有效性和完整性。MySQL中的约束有以下几种&#xff1a; 1. 主键约束&#xff08;Primary Key Constraint&#xff09;&#xff1a;主键是用于唯一标识表中每行记…

浅谈Servlet、HTTP

一、Servlet Servlet 是Java Web 开发的规范。任何一个mvc的框架都是servlet发展来的。SpringMVC使用DispatcherServlet拦截所有API请求&#xff0c;自定义注解进行URL匹配。 Servlet层次结构 Setvlet生命周期 1、工作流程 1.Web Client 向Servlet容器&#xff08;Tomcat&…

Java 实现更新顺序表中的指定元素

一、思路 1.定义一个 pos 变量为要更新的位置&#xff0c;定义一个 value 变量为更新后的数值. 2.顺序表不能是空的&#xff0c;就肯定不可以更新元素. 3.pos位置要合法&#xff0c;要保证 pos 位置是处在顺序表范围内的. 4.更新功能不需要考虑扩容&#xff0c;因为不涉及到元素…

传统制作 VS AI制作,如何一键制作PPT ?

教你如何快速的生成一个可用的 PPT&#xff0c;以及现在比较主流的 ChatGPT PPT 衍生工具推荐。 一、原理 结合AI生成 PPT 的原理其实非常简单&#xff0c; 现有的一些 PPT 软件或者开源工具会提供一种文本格式&#xff0c;我们只需要给出定固定的格式&#xff0c;把内容输入…

分享几个实用的C站AI模型平替网站

分享几个实用的C站AI模型平替网站 部分用户可能没有mofa工具访问Civitai ( C站)下载AI模型&#xff0c;所以给大家分享几款国内版AI模型素材库&#xff0c;无障碍访问下载Stable diffusion模型。 1、LiblibAI 访问速度快&#xff0c;作品墙、有提示词参考&#xff0c;无需登录…

SciencePub学术 | 智能交通类重点SCIEI征稿中

SciencePub学术刊源推荐: 智能交通类SCI&EI征稿中&#xff01;进展顺利&#xff0c;录用率高&#xff0c;连续十年IF稳定上升。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 【期刊简介】IF&#xff1a;4.0-4.5↑&#xff0c; JCR 2区&#xff0c;…

剪映自动打关键帧

牙叔教程 简单易懂 这是给单张图片打关键帧的教程, 给图片打关键帧有四个步骤 鼠标点选图片打起始帧跳转到图片末尾打结束帧 打帧是一件很费手的事情, 所以我写了个自动化的代码, 专门用来打关键帧, 使用的软件是 AutoHotkey 关键帧参数的详细解释 剪映 自动打关键帧 AutoH…