[Algorithm][双指针][复写零][快乐数][盛水最多的容器][有效三角形的个数]详细解读 + 代码实现

目录

  • 1.复写零
    • 1.题目链接
    • 2.算法原理讲解
    • 3.代码实现
  • 2.快乐数
    • 1.题目链接
    • 2.算法原理讲解
    • 3.代码实现
  • 3.盛水最多的容器
    • 1.题目链接
    • 2.算法原理讲解
    • 3.代码实现
  • 4.有效三角形的个数
    • 1.题目链接
    • 2.算法原理讲解
    • 3.代码实现

1.复写零

1.题目链接

  • 题目链接

2.算法原理讲解

  1. 先找到最后一个"复写"的数
    • 先判断cur位置的值
    • 决定dest向后移动一步或者两步
    • 处理边界情况,if(num[n - 2] == 0)
      • num[n - 1] = 0
      • cur--;
      • dest -= 2;
    • 判断dest是否到末尾
    • cur++;
  2. "从后向前"完成复写操作

3.代码实现

void DuplicateZeros(vector<int>& arr) 
{
    int cur = 0, dest = -1;
    int n = arr.size();

    // 找最后一个"复写"位置
    while(cur < n)
    {
        if(arr[cur])
        {
            dest++;
        }
        else
        {
            dest += 2;
        }

        if(dest >= n - 1)
        {
            break;
        }

        cur++;
    }

    // 处理一下边界情况
    if(dest == n)
    {
        arr[n - 1] = 0;
        cur--;
        dest -= 2;
    }

    // 从后往前复写
    while(cur >= 0)
    {
        if(arr[cur])
        {
            arr[dest--] = arr[cur--];
        }
        else
        {
            arr[dest--] = 0;
            arr[dest--] = 0;
            cur--;
        }
    }
}

2.快乐数

1.题目链接

  • 题目链接

2.算法原理讲解

  • 本题中,将快慢指针抽象了两个数
    • slow每次变化一次,fast每次变化两次,即可达到"快慢指针"效果
  • "快慢指针"在此题中,用于判环
    • 由于两"指针"速度并不一样,在快指针总是会追上慢指针的

3.代码实现

class Solution {
public:
    int BitSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int tmp = n % 10;
            sum += tmp * tmp;
            n /= 10;
        }

        return sum;
    }

    // 本题将双指针的"指针"抽象成了两个数
    bool isHappy(int n) 
    {
        int slow = n, fast = n;
        while((slow = BitSum(slow)) != (fast = BitSum(BitSum(fast))));

        return slow == 1;
    }
};

3.盛水最多的容器

1.题目链接

  • 题目链接

2.算法原理讲解

  • 为了⽅便叙述,假设「左边边界」⼩于「右边边界」

  • 如果此时固定⼀个边界,改变另⼀个边界,⽔的容积会有如下变化形式:

    • 容器的宽度⼀定变⼩
    • 由于左边界较⼩,决定了⽔的⾼度
      • 如果改变左边界,新的⽔⾯⾼度不确定,因此容器的容积可能会增⼤
    • 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界
      • 也就是不会超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的
        请添加图片描述
  • 由此可⻅,左边界和其余边界的组合情况都可以舍去

    • 所以可以left++跳过这个边界,继续去判断下⼀个左右边界
  • 不断重复上述过程,每次都可以舍去⼤量不必要的枚举过程,直到leftright相遇

    • 期间产⽣的所有的容积⾥⾯的最⼤值,就是最终答案

3.代码实现

int MaxArea(vector<int>& height) 
{
    int left = 0, right = height.size() - 1;
    int maxV = 0;
    while(left < right)
    {
        int v = min(height[right], height[left]) * (right - left);
        maxV = v > maxV ? v : maxV;

        if(height[left] < height[right])
        {
            left++;
        }
        else
        {
            right--;
        }
    }

    return maxV;
}

4.有效三角形的个数

1.题目链接

  • 题目链接

2.算法原理讲解

  • 优化对整个数组排序,可以简化比较模型,减少比较次数
  • 在有序的情况下,只需较⼩的两条边之和⼤于第三边即可
  • 设最⻓边枚举到max位置,区间[left, right]max位置左边的区间(也就是⽐它⼩的区间)
    • if (nums[left] + nums[right] > nums[max])
      • 说明[left, right - 1]区间上的所有元素均可以与nums[right]构成⽐nums[max]⼤的⼆元组
      • 共有right - left
      • 此时right位置的元素的所有情况相当于全部考虑完毕,right--,进⼊下⼀轮判断
    • if (nums[left] + nums[right] <= nums[max])
      • 说明left位置的元素是不可能与[left + 1, right]位置上的元素构成满⾜条件的⼆元组
      • left位置的元素可以舍去
      • left++进⼊下轮循环
        请添加图片描述

3.代码实现

int TriangleNumber(vector<int>& nums) 
{
    // 优化:排序
    sort(nums.begin(), nums.end());

    int count = 0;
    for(int max = nums.size() - 1; max >= 2; max--) // 固定最大数
    {
        int left = 0, right = max - 1;
        while(left < right)
        {
            if(nums[left] + nums[right] > nums[max]) // 可以组成
            {
                count += right - left;
                right--;
            }
            else // 不可以组成
            {
                left++;
            }
        }
    }

    return count;
}

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

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

相关文章

洁净室空气颗粒物检测-激光尘埃粒子计数器如何选型 北京中邦兴业

空气颗粒是通过迫使空气通过颗粒计数器中的空腔来测量的&#xff0c;该计数器使用激光来测量和计数颗粒。这是通过一个称为光散射的过程来实现的。 粒子计数器的部件 在粒子计数器内&#xff0c;你会发现一个激光传感器块。这就是使用光散射原理来确定粒子大小和数量的地方。…

Linux内核与基础命令学习总结

Linux操作系统 Linux操作系统博大精深&#xff0c;其中对线程&#xff0c;IO&#xff0c;文件系统等概念的实现都很有借鉴意义。 ​ 文件系统和VFS 文件系统的inode上面讲过了。VFS主要用于屏蔽底层的不同文件系统&#xff0c;比如接入网络中的nfs文件系统&#xff0c;亦或是w…

51单片机入门_江协科技_29~30_OB记录的自学笔记_DS18B20温度传感器

29. DS18B20温度传感器 29.1. DS18B20介绍 •DS18B20是一种常见的数字温度传感器&#xff0c;其控制命令和数据都是以数字信号的方式输入输出&#xff0c;相比较于模拟温度传感器&#xff0c;具有功能强大、硬件简单、易扩展、抗干扰性强等特点 •测温范围&#xff1a;-55C 到 …

Go 编译构建的一些细节

Go 编译构建的一些细节 发现自己竟然没有怎么认真研究过 go 的编译构建命令。 结论前置 go run 专门用来运行命令源码文件的命令&#xff0c;一般用来运行单个文件go build 主要是用于测试编译。编译某个包或者项目&#xff0c;在当前目录下生成可执行文件go install 编译并…

图形化编程要怎么做

0. 简介 Scratch其实应该算得上最早做图形化编程的工程了。Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5]发布的一种图形化编程工具&#xff0c;主要面对全球青少年开放&#xff0c;是图形化编程工具当中最广为人知的一种&#xff0c;所有人都可以在软件中创作自…

大模型赋能:爬虫技术的全新革命

大模型加持下的爬虫技术革新&#xff1a;从BS4到提示工程的飞跃 在爬虫技术的演进历程中&#xff0c;内容解析一直是一个核心环节。传统的爬虫技术&#xff0c;如使用BeautifulSoup&#xff08;BS4&#xff09;等工具&#xff0c;需要逐个解析网页内容&#xff0c;通过XPath或C…

【NPS】内网穿透工具之 NPS

一、linux 安装 nps nps-releases&#xff1a;https://github.com/ehang-io/nps/releases 1.1、在 ubuntu下安装对应版本&#xff08;非docker&#xff09; 可以看到如下指令 wget https://ghproxy.com/https://github.com/ehang-io/nps/releases/download/v0.26.10/linux…

网络安全-自学笔记

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…

weblogic JSP action的配置

action(如xxx.do)可以在Java文件中通过注解的方式配置,也可以在web.xml中进行配置 在java文件中配置的场合 @WebServlet(xxxx.do) 并实现支持的方法:doGet或doPost等 或者 @WebServlet(xxxx.do) 并实现service方法 所有method的处理方法都会先经过service方法 在web.x…

【24年物联网华为杯】赛题分析与初步计划

赛事介绍 官网链接&#xff1a;2024 年全国大学生物联网设计竞赛 (sjtu.edu.cn) 含金量&#xff1a;属于A类赛事 &#xff08;注意&#xff1a;很多搜索结果的序号是按照选入时间排列的&#xff0c;与含金量无关&#xff0c;华为杯是23年选入的&#xff09; Kimi Chat: 全国…

经历分享:我是如何出版了人生的第一本书的,成体系化的神级Golang进阶笔记,

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

轻松上手MYSQL:MYSQL初识(下)

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《MYSQL入门》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松上手MYSQL&#xff1a;从零开始构建你的数据库世界 &#x1f680; &#x1f680;欢迎来到My…

Qt nodeeditor ROI 组态软件

节点显示节点连接属性设置插件导入导出 展示&#xff1a;

【小贴士|Unity】华佗热更版本控制配置

现在越来越多的新项目选择使用HybridCLR&#xff0c;而不是以前的Lua。也不妨有的项目会配置打包机器人以及版本控制&#xff0c;但是这个版本控制的配置还真需要注意一些。&#xff08;因为我就踩坑了&#xff09; 如图所示&#xff0c;当你第一次执行HybridCLR/Generate/All后…

监控平台zabbix的认识与搭建

一. 监控系统的相关知识 1. 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabbix 可以实现集中监控管理的应用程序。 监控的…

基于51单片机的秒表设计—0.01精度、有提示音

基于51单片机的秒表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.数码管显示&#xff0c;精度为0.01&#xff1b; 2.按键控制启动/停止&#xff0c;暂停/开始&#xff1b; 3.有一秒钟一次提示…

金三银四面试题(二十):单例模式知多少?

设计模式也是面试中的热门考题&#xff0c;基本这个部分都是问问你知不知道XXX设计模式&#xff0c;有什么用&#xff0c;优缺点&#xff0c;然后再现场手写一个demo。很多时候是和spring一起考的&#xff0c;问问你知不知道spring框架用了哪些设计模式。今天我们来先看看单例模…

信息系统项目管理师——成本管理计算专题(一)

常见考点如下: ①问项目预算、BAC、成本基准、应急储备、管理储备的含义及它们之间的区别 ②给出成本基准和管理储备求项目预算&#xff0c;或者给出预算求成本基准等等 ③看图找 PV、AC、EV、SV、CV、BAC、EAC、ETC等 ④根据题干求项目的PV、AC、EV、SV、CV、BAC、EAC、ETC等 …

骑行听音乐用什么运动耳机?五款宝藏机型汇总推荐

热爱骑行的你们&#xff0c;是否曾为选购一款合适的运动蓝牙耳机而纠结&#xff1f;市面上品牌众多、功能各异的运动耳机&#xff0c;究竟哪款才是你的运动良伴&#xff1f;今天&#xff0c;我就来聊聊运动蓝牙耳机的选购要点&#xff0c;并为你推荐几款高性价比的运动蓝牙耳机…

OMS系统集成案例分享:数环通轻松实现OMS系统对接

在数字化浪潮席卷全球的今天&#xff0c;订单管理系统&#xff08;OMS&#xff09;作为连接企业与客户的桥梁&#xff0c;正逐渐成为企业提升订单处理效率、优化客户体验的关键。然而&#xff0c;由于企业内部系统的复杂性和多样性&#xff0c;OMS系统与其他业务系统的集成往往…