【刷题】优选算法

优选算法

双指针

202. 快乐数

链接:. - 力扣(LeetCode)

【思路】

第一个实例是快乐数,因为会变为1且不断是1的循环

第二个实例不可能为1,因为会陷入一个没有1的循环

根据两个实例和鸽巢原理可以发现不断的平方和最终都会形成环,所以我们可以联想到用快慢指针,慢指针走一步,快指针走两步,最终会在环相遇,判断相遇时是否为1。

    //‘平分和’操作
    int squareSum(int num)
    {
        int sum = 0;
        while(num)
        {
            int unit = num % 10;
            num /= 10;
            sum += unit*unit;
        }
        return sum;
    }

    bool isHappy(int n) 
    {
        //快慢指针
        int fast = n, slow = n;

        //相遇才停下
        do 
        {
            //慢指针操作一次
            slow = squareSum(slow);
            //快指针操作两次
            fast = squareSum(squareSum(fast));
        } while(fast != slow);

        //相遇的值等于1才行
        return slow == 1;
    }

11. 盛最多水的容器

链接:. - 力扣(LeetCode)

【思路】

容量 = 底(下标相减) * 高(数组元素较小值)

如图,我们先算出最左边(1)和最右边(7)围起来的容量,然后,7不动,1继续和7的左边3,8,4...遍历算出容量,你会发现底是不断缩短的,同时高一直都是1,因为高只有两种情况,比它小或和它相等,所以1和7左边的值算出来的容量都是比1和7的容量小的,因为底在不断变小同时高可能不变也可能变小。

所以可以得出结论,每次算完容量后,元素较小的直接移动,不用遍历其他结果。

    int maxArea(vector<int>& height) 
    {
        int head = 0, tail = height.size() - 1;

        int final_cap = 0;
        while(head < tail)
        {
            //计算容量,保留较大值
            int capacity = (tail - head) * min(height[head], height[tail]);   
            final_cap = max(final_cap, capacity);

            //思路的推断移动高度小的一方
            if(height[head] < height[tail])
            {
                ++head;
            }
            else
            {
                --tail;
            }
        }
        
        return final_cap;
    }

611. 有效三角形的个数

链接:. - 力扣(LeetCode)

【思路】

判断三角形:最长边小于其它边之和。

先排序获取单调性配合双指针解决问题。

先固定最长边,然后先从剩下的区间两端作为另外两条边,2+9>10,同时因为单调性,left的右边都比left大,所以right和左边任意一条组合都大于10,计算完组合后, right--继续找下一条边,此时2+5<10,因为单调性,right的左边都比right小,所以left和right左边的任意一条组合都小于10,排除left,left++, 继续找下一条边,这样一个区间找完就视为完成一次最大边的固定,需要固定下一条最大边,直到固定完所有最大边,最后一条最大边是倒数第三条,因为还剩最后两条构不成三角形。

    int triangleNumber(vector<int>& nums) 
    {
        //排序获取单调性
        sort(nums.begin(), nums.end());

        //固定一个最大边
        int ret = 0;
        for(int i = nums.size() - 1; i >= 2; --i)
        {
            //将区间两端作为两条边,不断缩小
            int left = 0, right = i - 1;
            while(left < right)
            {
                if(nums[left] + nums[right] > nums[i])
                {
                    ret += right - left;
                    --right;
                }
                else
                {
                    ++left;
                }
            }
        }

        return ret;
    }

LCR 179. 查找总价格为目标值的两个商品

链接:. - 力扣(LeetCode)

【思路】

利用单调性和双指针解决

首先相加的总和sum有三种情况,sum == target, sum < target, sum > target

先从区间两端开始,2+21<30,此时right是最大的,所以left和其他数相加只会更小,所以可以把left排除

此时left来到11的位置,11+21>30,此时left是最小的,也就意味着right和其他值相加只会更大,所以可以排除right,

    vector<int> twoSum(vector<int>& price, int target) 
    {
        vector<int> v;
        //从区间两端开始
        int left = 0, right = price.size() - 1;

        while(left < right)
        {
            int sum = price[left] + price[right];
            //等于
            if(sum == target)
            {
                v = {price[left], price[right]};
                break;
            }
            //小于
            else if(sum < target)
            {
                ++left;
            }
            //大于
            else
            {
                --right;
            }
        }  

        return v;
    }

滑动窗口

209. 长度最小的子数组

链接:. - 力扣(LeetCode)

【思路】

当我们发现暴力解法的两个指针都可以不会退,也就是同向双指针,这时候就可以考虑使用滑动窗口思想了。

首先固定left,让right移动,不断求区间和并判断是否满足target,一旦满足你会发现right不用走了,因为right往后走虽然都满足target但是长度也在不断变大,这里利用了单调性的思想把多余的排除了,所以此时应该left往前走一步,然后继续这样判断。

    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int left = 0, right = 0; 
        int sum = nums[right], ret = INT_MAX; 
        int n = nums.size();

        while(left < n && right < n)
        {
            //移动左边
            if(sum >= target)
            {
                ret = min(ret, right - left + 1);
                sum -= nums[left++];
            }
            //移动右边
            else
            {
                ++right;
                if(right < n)
                {
                    sum += nums[right];
                }
            }
        }

        return ret == INT_MAX ? 0 : ret;
    }

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

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

相关文章

在unity中实现把普通的照片,图片 变成油画风格的shader实现

可以通过对shader的Radius的值得设置来改变油画风格的力度&#xff0c;0最小&#xff0c;10是最大。

【项目开发 | 跨域认证】JSON Web Token(JWT)

未经许可,不得转载。 文章目录 JWT设计背景:跨域认证JWT 原理JWT 结构JWT 使用方式注意JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理、结构及用法。 JWT设计背景:跨域认证 互联网服务的用户认证流程是现代应用中的核心组成部分,通常的流程…

vue3中如何实现标准元素 拖动 功能 【收藏备用】

最近在用vue3做一个企业后台管理系统的项目,在登录页面的时候需要用户滑动滑块来获取验证码登录系统 用到了元素拖放 这里也顺便记录一下 如何使用的. 目录 1.功能介绍 2.代码部分 3 实现过程 3.1 设置可拖动元素 3.2 拖动什么 3.3 放到何处 3.4 进行放置 1.功能介绍…

Linux(CentOS)运行 jar 包

1、在本地终端运行&#xff0c;关闭终端&#xff0c;程序就会终止 java -jar tlias-0.0.1-SNAPSHOT.jar 发送请求&#xff0c;成功 关闭终端&#xff08;程序也会终止&#xff09; 发送请求&#xff0c;失败 2、在远程终端运行&#xff0c;关闭终端&#xff0c;程序就会终止 …

Local Dimming和Mini LED简介

文章目录 Local Dimming和Mini LED的介绍区别和联系联系区别总结 Local Dimming和Mini LED的介绍 电视显示技术中的Local Dimming和Mini LED都是用于提升画面质量的背光技术&#xff0c;主要目的是增强对比度和改善黑色表现。以下是对它们的详细介绍&#xff1a; Local Dimmin…

数据结构选择题及答案

一、选择题 1、下列查找方法中&#xff0c;&#xff08; &#xff09;适用于查找有序单链表。 A&#xff0e;分块查找; B&#xff0e;哈希查找; C&#xff0e;顺序查找; D&#xff0e;二分查找; 2、在有n个结点的二叉树的二叉链表表示中&#xff0c;空指针数为( )。 A&#xf…

npm完整发包流程(亲测可验证)

1. 准备工作 &#xff08;1&#xff09; 在npm官网上注册一个账号 &#xff08;2&#xff09; 注册成功之后&#xff0c;npm会发送一封邮件给你&#xff0c;点击邮件里面的链接&#xff0c;做确认关联操作&#xff08;必需&#xff09; 2. 创建自己的npm包 &#xff08;…

3.2 软件需求:面对过程分析模型

面对过程分析模型 1. 需求分析的模型概述1.1 面对过程分析模型-结构化分析方法1.2 结构化分析的过程 2. 功能模型&#xff1a;数据流图初步2.1 加工2.2 外部实体&#xff08;数据源点/终点&#xff09;2.3 数据流2.4 数据存储2.5 注意事项 3. 功能模型&#xff1a;数据流图进阶…

【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)

向量(Vector)和矩阵(Matrix)&#xff1a;用于表示数据集&#xff08;Dataset&#xff09;和特征&#xff08;Feature&#xff09;。矩阵运算&#xff1a;加法、乘法和逆矩阵(Inverse Matrix)等&#xff0c;用于计算模型参数。特征值(Eigenvalues)和特征向量(Eigenvectors)&…

向量数据库PGVECTOR安装

文章目录 前提向量数据库介绍PGVECTOR安装1、pgvector下载2、编译安装3、创建vector扩展 前提 已经安装好了pg14版本。 其他版本也可以。 pg安装教程&#xff1a;https://blog.csdn.net/yushaoyyds/article/details/138855306?spm1001.2014.3001.5502 向量数据库介绍 向量数…

头歌网络安全(11.12)

头歌禁止复制解决 必须先下篡改猴&#xff01;&#xff01;&#xff01;&#xff01; 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关&#xff1a;使用Servlet生成验证码 任务描述 本关任务&#xff1a;使用se…

技术栈1:nginx基础入门

目录 1.nginx概述 2.正向代理与反向代理 3.负载均衡 4.动静分离 5.nginx反向代理配置 1.nginx概述 Nginx (engine x)是一个高性能的HTTP和反向代理Web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发…

自建CDN是否适合您的企业?

在信息化加速发展的今天&#xff0c;CDN&#xff08;内容分发网络&#xff09;对于优化内容传输速度、提升用户体验的重要性已不容忽视。企业在选择CDN方案时&#xff0c;常常面临两个选择&#xff1a;自建CDN或租用CDN服务。自建CDN让企业拥有高度的自主权和灵活性&#xff0c…

aws xray通过设置采样规则对请求进行过滤

参考资料 https://github.com/aws/aws-xray-sdk-pythonpython api reference&#xff0c;https://docs.aws.amazon.com/xray-sdk-for-python/latest/reference/node api reference&#xff0c;https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/ 初始化环境…

特色3D打印stm32迷你8轴双核心主板

我自己设计的3D打印机主板 1. 这是一块迷你的8轴主板, 主板尺寸为100mm*75mm, 使用一个8cm静音风扇散热足够了2. 这是一个带有保护的板子, 驱动上的gpio具有过压保护功能, 能够直接抗住24V的冲击, 意味着一个驱动炸了, 板子不烧, 并且其他的驱动也没事, 主板支持自动关机3. 8…

无人机动力测试台如何快速外接第三方传感器

前言 动力测试台对于测试动力系统的拉力、扭矩、RPM 和效率至关重要。将传感器集成到您的测试中增加了另一层优化&#xff0c;可以将您的性能提升到一个新的水平。 在无人驾驶行业中&#xff0c;有充分的证据表明&#xff0c;从外部传感器收集数据可能具有挑战性。为了解决这…

Autosar CP Network Management模块规范导读

Network Management模块的主要功能 网络管理适配:作为通信管理器和总线特定网络管理模块之间的适配层,实现不同总线网络管理功能的统一接口,确保系统中各种网络的协同工作。协调功能 网络协调关闭:使用协调算法协调多个网络的关闭,确保它们在合适的时间同步进入睡眠模式,…

数据库系统概论(期末复习版)

&#xff08;一&#xff09;绪论 数据(Data)&#xff1a;是数据库中存储的基本对象 数据的定义&#xff1a;描述事物的符号记录 数据的种类&#xff1a;文字、图形、图象、声音等 数据的特点&#xff1a;数据与其语义是不可分的 数据库(Database,简称DB)&#xff1a;是长期…

【Linux】进程池实现指南:掌控并发编程的核心

文章目录 1.为什么要有进程池2.进程池的工作原理2.1 进程池的工作流程 3. 进程池的实现&#xff08;重点&#xff09;3.1 Channel类3.2 ProcessPool类3.2.1 创建子进程3.2.2 杀死所有进程3.2.3 其他功能 3.3 控制进程池 4. 完整代码5. 总结 &#x1f3e0; 大家好&#xff0c;我…