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

news2025/2/7 1:47:56

目录

  • 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;
}

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

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

相关文章

使用python在本地指定的目录临时模拟服务器,看懂这份Python面经大厂真不是问题

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

Unity MySql安装部署与Unity连接 下篇

一、前言 上篇讲到了如何安装与部署本地MySql&#xff1b;本篇主要讲Unity与MySql连接、创建表、删除表&#xff0c;然后就是对表中数据的增、删、改、查等操作。再讲这些之前会说一些安装MySql碰到的一些问题和Unity连接的问题。 当把本地MySql部署好之后&#xff0c;我们可能…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK&#xff0c;供开发者下载和使用。 附上站点地址&#xff1a;Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk&#xff0c;简单实用~ 找到版本&#xff0c;点击tar.gz进…

【Origin+Python】使用External Python批量出图代码参考2

目录 前情提要进阶代码去除水印 前情提要 基础教程见链接: 【OriginPython】使用External Python批量出图代码参考 这里主要介绍一些进阶代码以及使用盗版origin要如何去除水印的方法&#xff01; ############################################################# 进阶代码 …

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

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

关于android studio无法连接到荣耀手机的超级简单终极解决办法

首先我要吐槽下网上那么多人那么多文章没一个有用的。亲测机型&#xff1a;荣耀40c 首先官方指导&#xff1a; 1.换数据线 2.开发者模式----》》》关闭锁屏----》》》打开唤醒 3.安装adb 驱动 下面几点是误区&#xff1a;千万别碰&#xff0c;浪费大家时间 被网上文章误解…

【Next】动态路由、加载 UI 和流式传输

动态路由 动态段作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。 /app/blog/[slug]/page.tsx export default function Page({params}: {params:{slug:string}}) {return <h1>Slug Page -- {params.slug}</h1> };/app/shop/[...slug]/pa…

SAP 技巧篇:Script脚本模拟人工操作批量录入数据

“ 现在大环境都讲人工智能、自动化办公等场景的应用&#xff0c;这里我们介绍一下SAP本身自带的自动化工具” 文章最后附最终脚本 01 — 背景需求 SAP&#xff1a;批量录入工具&#xff1a;LSMW/BDC/Script 三大工具 LSMW&#xff1a;应用场景多&#xff0c;实现方法多&am…

C# Solidworks二次开发:模型中实体Entity相关操作API详解

大家好&#xff0c;今天要讲的一些API是关于实体的相关API。 在开发的过程&#xff0c;很多地方会涉及到实体的相关操作&#xff0c;比如通过实体选中节点。下面就直接开始介绍API&#xff1a; &#xff08;1&#xff09;第一个API为Select4&#xff0c;这个API的含义为选中一…

工业物联网让“制造”变成“智造”!——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断进步和工业的持续发展&#xff0c;物联网&#xff08;IoT&#xff09;技术的出现为制造业带来了前所未有的变革。工业物联网&#xff08;IIoT&#xff09;作为物联网技术在工业领域的应用&#xff0c;正在逐渐改变传统的制…

JavaScript:使用color-convert实现颜色色值转换

color-convert支持如下颜色格式的转换&#xff1a; rgb, hsl, hsv, hwb, cmyk, ansi, ansi16, hex文档 https://www.npmjs.com/package/color-converthttps://github.com/Qix-/color-convert 安装 $ npm install color-convert使用示例 import convert from color-convert…

深入理解Mesh Shader优化原理

参照AMD官网文章和GDC中其分享内容https://gpuopen.com/learn/mesh_shaders/mesh_shaders-index/总结自用&#xff0c;大佬直接原文。 一、传统顶点着色器管线与Mesh 着色器对比 具体之前也研究过可参照&#xff1a;DX12_Mesh Shaders Render 这里主要针对之前忽略的一些知识…

[BT]BUUCTF刷题第17天(4.15)

第17天&#xff08;共3题&#xff09; Web [强网杯 2019]高明的黑客 .tar.gz 是 Linux 系统下的压缩包&#xff0c;访问即可下载 打开后有3000多个php文件&#xff0c;通过题解得知需要写Python脚本找出合适的GetShell文件&#xff08;因为每个文件里都会通过system函数执行…

贵阳市人民政府副市长刘岚调研珈和科技

4月9日&#xff0c;贵阳市人民政府副市长、党组成员刘岚一行到珈和科技走访调研&#xff0c;珈和科技总经理冷伟热情接待了考察团&#xff0c;就企业算力需求与合作&#xff0c;特色产业园区建设&#xff0c;科技成果转化落地等方面进行深入交流。 贵阳市教育局局长李波&#…

Vmware 虚拟机自定义IP地址 - UbuntuServer2204

Vmware 虚拟机自定义IP地址 - UbuntuServer2204 设置网段 选择喜欢的网段&#xff0c; 例如&#xff1a; 166 自定义 IP地址 打开虚拟机&#xff0c; 输入命令查看网卡名 ip addr查看网卡配置文件 ls -al /etc/netplan/编辑网卡配置文件 sudo vim /etc/netplan/00-installe…

稀疏数组思想

稀疏数组的处理方法是&#xff1a; 1)记录数组一共有几行几列&#xff0c;有多少个不同的值 2)思想&#xff1a;把具有不同值的元素的行列及值记录在一个小规模的数组中&#xff0c;从而缩小程序的规模 例如下面原数组对应稀疏数组&#xff1a;

Git-常规用法-含解决分支版本冲突解决方法

目录 前置条件 已经创建了Gitee账号 创建一个远程仓库 Git的优点 版本控制 Git 下载 Git的使用 检查Git的是否安装成功 git的常用命令 常用流程 Git 分支 分支流程 Git 远程仓库 远程仓库流程 特殊 可能遇到的问题 前置条件 已经创建了Gitee账号 创建一个远程仓…

CTK插件框架学习-事件监听(07)

CTK插件框架学习-服务工厂(06)https://mp.csdn.net/mp_blog/creation/editor/137295686 一、简介 事件监听指当事件发生变化时所产生的通信&#xff0c;是动态的&#xff0c;对于已经发生过的事件无法监听 二、事件类型 1、框架事件 监听框架状态变化&#xff0c;因为监听…

【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体

Unity开发ARFoundation相关应用首先安装ARFoundation包 然后设置XR 1.基础AR场景框架搭建 2.一个基本的点击克隆物体到识别的平面脚本 挂在XROrigin上 脚本AppController 脚本说明书 ## 业务逻辑 AppController 脚本旨在实现一个基本的 AR 应用程序功能&#xff1a;用户通过…

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

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