codetop标签双指针题目大全解析(四),双指针刷穿地心!!!!!

news2024/12/25 9:27:28

复习复习复习!!

  • 1.长度最小的子数组
  • 2.移动零
  • 3.盛水最多的容器
  • 4.旋转链表
  • 5.最接近的三数之和
  • 6.删除有序数组中的重复项
  • 7.返回倒数第k个节点的值
  • 8.四数之和
  • 9.验证回文串

1.长度最小的子数组

在这里插入图片描述
考滑动窗口的
要注意是大于等于不是等于
看错题目一顿调

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0;
        int right = 0;
        int sum = 0;
        int len = INT_MAX;
        while(right < nums.size()){
            sum += nums[right];
            right++;
            while(sum >= target){
                len = min(len, right - left);
                sum -= nums[left];
                left ++;
            }
        }
        return len == INT_MAX ? 0 : len;
    }
};

2.移动零

在这里插入图片描述
非0元素前移,这和秒杀双指针里面的移除特定元素是一样的
最后别忘了填充
二刷debug:秒

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //非0前移
        int slow = 0;
        for(int fast = 0; fast < nums.size(); fast ++){
            if(nums[fast] != 0){
                nums[slow] = nums[fast];
                slow++;
            }
        }
        //剩下部分填充0
        for(; slow < nums.size(); slow ++) nums[slow] = 0;
    }
};

3.盛水最多的容器

双指针秒杀里面的原题

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

4.旋转链表

在这里插入图片描述
整体思路是,将链表头尾连起来,再在新的表尾处砍断
里面有非常多的小细节,比如 k = k % length;
寻找新的表尾:成环右移k个,说明链表倒数第k个会变成表头,for (int i = 0; i < length - k - 1; i++)可以定位到表头前面一个也就是表尾

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (!head || !head->next || k == 0) return head;
        // 第一步:计算链表长度并形成环形链表
        ListNode* lastNode = head;
        int length = 1;
        while (lastNode->next) {
            lastNode = lastNode->next;
            length++;
        }
        lastNode->next = head; // 形成环形链表

        // 第二步:计算实际需要移动的步数
        k = k % length;
        if (k == 0) {
            lastNode->next = NULL; // 恢复链表
            return head;
        }
        // 第三步:找到新的头节点和尾节点
        ListNode* newTail = head;
        for (int i = 0; i < length - k - 1; i++) {
            newTail = newTail->next;
        }
        ListNode* newHead = newTail->next;

        // 断开链表
        newTail->next = NULL;

        return newHead;
    }
};

二刷debug:换了一个写法,用快慢指针做,需要注意的是快指针停下来的地方不应该是null,而是head

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(!head || !head->next || k == 0) return head;//检查链表是否为空或不需要旋转
        ListNode* fast = head;
        ListNode* slow = head;

        ListNode* p = head;
        int len = 1;
        while(p->next){
            p = p->next;
            len ++;
        }
        p->next = head;
        //倒数第 n 个节点变成尾节点
        k = k % len;
        for(int i = 0; i < k; i ++) fast = fast->next;
        while(fast->next != head){//这里是head而不是null
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* newHead = slow->next;
        slow->next = nullptr;
        return newHead;

    }
};

5.最接近的三数之和

在这里插入图片描述

别人写的代码怎么这么优雅┭┮﹏┭┮
重点在于判断最近的,用abs绝对值
if(abs(target - close) < abs(target - closeNum)) closeNum = close
close是当前的三个元素,closeNum是最接近的,初始化为nums[0] + nums[1] + nums[2]

这个return的是和,重复不重复只是降低复杂度,不会改变答案,不用像三数之和一样死扣不重复

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int closeNum = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.size(); i ++){
            if(i && nums[i] == nums[i - 1]) continue;
            int left = i + 1, right = nums.size() - 1;
            while(left < right){
                int close = nums[i] + nums[left] + nums[right];
                if(abs(target - close) < abs(target - closeNum)) closeNum = close;
                if(close > target) right--;
                else if(close < target) left++;
                else return target;
            }
        }
        return closeNum;
    }
};

6.删除有序数组中的重复项

在这里插入图片描述
快慢指针,一开始没能灵活应用,还得练
二刷debug:不会

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int slow = 0, fast = 1;
        while(fast < nums.size()){
            if(nums[slow] == nums[fast]){
                fast++;
            }else{
                slow++;
                nums[slow] = nums[fast];
            }
        }
        return slow + 1;
    }
};

7.返回倒数第k个节点的值

假如链表长度是k,返回倒数第k个的情况要留意处理
这题题目给的k一定是合理的!

class Solution {
public:
    int kthToLast(ListNode* head, int k) {
        ListNode* slow = head;
        ListNode* fast = head;
        
        // fast 指针先前进 k 步
        for (int i = 0; i < k; i++) {
            fast = fast->next;
        }
        
        // 同时前进 slow 和 fast,直到 fast 到达链表末尾
        while (fast != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }
        
        // 此时 slow 所指向的即为倒数第 k 个节点
        return slow->val;
    }
};

8.四数之和

双指针秒杀原题
二刷忘记了一些细节,longlong和需要排序sort

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

9.验证回文串

在这里插入图片描述
先把所有字符转化成小写,并过滤掉空格和标点这类字符。然后对剩下的字符执行双指针中的两端向中心的双指针算法即可。

新学到的库函数:

  1. isalnum( c ):isalnum 检查字符c是不是字母或者数字,如果是的话,返回true,不是的话返回false
  2. tolower( c ):tolower 将字符 c 转换为小写字母。如果 c 本身是小写字母或非字母字符,返回值将与 c 相同。
class Solution {
public:
    bool isPalindrome(string s) {
        string sb;
        for(int i = 0; i < s.size(); i ++){
            char c = s[i];
            if(isalnum(c)){
                sb += tolower(c);
            }
        }
        
		//双指针两头往中间验证
        s = sb;
        int left = 0, right = sb.size() - 1;
        while(left < right){
            if(sb[left] != sb[right]) return false;
            left++;
            right--;
        }
        return true;


    }
};

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

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

相关文章

CNAI趋势下,打造一体化AI赋能平台

在数字化转型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动企业创新和转型的核心力量。云原生技术以其灵活性和可扩展性&#xff0c;为AI的应用和发展提供了坚实的基础。本文将探讨云原生人工智能&#xff08;CNAI&#xff09;如何为企业带来颠覆性的变革…

cnn突破八(两层卷积核bpnet网络扩展)

cnn突破七中x【&#xff1f;】怎么求&#xff1f;我们举个例子&#xff1a; 接着cnn突破七&#xff1a; hicnn【】来自temphicnn【】2*2最大池化&#xff1a; temphicnn[0]x[i0,j0,5*5方阵]*w1cnn[0-24]&#xff0c; hicnn是5*5的&#xff0c;temphicnn是10*10的&#xff0…

YOLOv8改进 - 注意力篇 - 引入SimAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SimAM注意力在YOLOv8中的使用。包含SimAM原理分析&#xff0c;SimAM的代码、SimAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SimAM原理分析 SimAM官方论文地址&#xff1a;SimAM文章 SimAM官方代码地址&#…

【土地那些事儿】一文读懂“集体所有土地”

今天咱们来聊一个既熟悉又神秘的概念——集体所有土地。在中国广袤的大地上&#xff0c;除了国有土地外&#xff0c;还有一种特殊的土地所有权形式&#xff0c;它关乎亿万农民的切身利益&#xff0c;那就是集体所有土地。来&#xff0c;让我们一起揭开它的面纱吧&#xff01; …

根据指数做波段年化利率分析

根据指数做波段年化利率分析 股票投资&#xff0c;是众多投资方式中的一种。然而&#xff0c;每个人有不同的炒股方式&#xff0c;对股票不同的操作也会获得不同的收益/损失。作为“金融消费者”&#xff0c;如何做好自己在股票中的消费行为&#xff0c;是一门巨大的学问。这里…

D31【python 接口自动化学习】- python基础之输入输出与文件操作

day31 文件的打开 学习日期&#xff1a;20241008 学习目标&#xff1a;输入输出与文件操作&#xfe63;-43 常见常新&#xff1a;文件的打开 学习笔记&#xff1a; 文件的概念 使用open()函数打开文件 文件路径处理 文件打开模式 总结 文件操作包括&#xff1a;打开&#…

C++:string (用法篇)

文章目录 前言一、string 是什么&#xff1f;二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1&#xff09;begin2&#xff09;end3&#xff09;使用 2. rbegin 与 r…

第33次CCF计算机软件能力认证-第4题十滴水

题干&#xff1a; 十滴水是一个非常经典的小游戏。 小 C C C 正在玩一个一维版本的十滴水游戏。 我们通过一个例子描述游戏的基本规则。 游戏在一个 1 c 1c 1c 的网格上进行&#xff0c;格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1≤x≤c) 编号&#xff0c;编号从左往…

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

【Redis】List类型的常用命令大全

这里的list列表相当于一个双端队列&#xff0c;也可以认为是双向链表&#xff0c;也可以认为是数组&#xff0c;后续的很多命令都使用到下标。 list的特点&#xff1a; list中的每个元素也都是String类型里面的元素可以重复列表中的元素是有序的&#xff0c;如果里面元素顺序进…

epoll究竟是同步的还是异步的?

简单说一句话&#xff0c;你需要分层看这个事&#xff1a; epoll 这个系统调用&#xff0c;是同步的&#xff0c;也就是必须等待操作系统返回值。 而底层用了 epoll 的封装后的框架&#xff0c;可以是异步的&#xff0c;只要你暴露给外部的接口&#xff0c;无需等待你的返回值…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

什么是变阻器?

变阻器是一种电子元件&#xff0c;主要用于调整电路中的电阻值&#xff0c;从而实现对电流、电压等电学参数的控制。它在电路中起到非常重要的作用&#xff0c;广泛应用于各种电子设备和实验装置中。 变阻器的主要作用是改变电路中的电阻值。在电路中&#xff0c;电阻值的大小…

二部图简单理解

目录 二部图简单理解 一、定义 二、性质与定理 三、原理举例 四、应用 二部图简单理解 二部图(Bipartite Graph),又称二分图,是图论中的一种特殊模型。以下是对二部图的详细介绍及原理举例: 一、定义 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(…

目标检测or实例分割中AP、MAP的计算

参考链接&#xff1a; 目标检测中AP、MAP的计算_51CTO博客_目标检测map计算 举个例子&#xff1a;

【JVM】内存分析工具JConsole/Visual VM

1 缘起 日常补充JVM调优&#xff0c;调优实践前需要学习一些理论做支撑&#xff0c; JVM调优三步&#xff1a;理论>GC分析>JVM调优&#xff0c; 我们会有一些玩笑话说&#xff0c;做了这么久Java开发&#xff0c;做过JVM调优吗&#xff1f; 做过&#xff0c;面试时。当然…

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

LC刷题专题:记忆化搜索

文章目录 576. 出界的路径数 本刷题专栏记录自己的记忆化搜索的做题。 576. 出界的路径数 题目链接及描述&#xff1a; https://leetcode.cn/problems/out-of-boundary-paths/description/ 第一次看到这个题目可能先入为主了&#xff0c;首先想到的是使用动态规划做&#xff…